Package: gpxcsv
GPX to CSV conversion (or to a Python list)PyPi Project PageThis tool can convert most gpx files to csv format. It preserves trackpoint extensions andtrklevel tags. It supports multiple<trk>entries per file, multiple<trkseg>segments. It powersgpxrunandmy gpx analysis web app.Advantages / FeaturesPreserves most trackpoint data:If a gpx file uses extensions and hashrfor heartrate data, it will make a csv with ahrcolumn. No need to ever add specific support for specific new or requested column names.Minimal dependencies:Only requires lxml.Easy command line usage with wildcards:gpxcsv file.gpxand done.gpxcsv *.gpxjust works.Preserves and identifies multi-trk or multi-trkseg data:Becausetrkandtrkseglevel tags get their own ID columns, multi-track or segment files preserve each segment or track as distinguishable.Easily create Pandas dataframe:Thegpxtolistfunction will create a python list for one-line conversation to a dataframe:pd.DataFrame(gpxtolist('myfile.gpx'))Supports JSON (even though I named the package gpxcsv):JSON support since it was easy from the list of dictionaries.Installation and UsagePip installpipinstallgpxcsvOr clone and install modulegitclonehttps://github.com/astrowonk/gpxcsv.gitcdgpxcsvpythonsetup.pyinstallUse directly with command line tool or as a python module. The following examples will createmyrun.csvgpxcsv myrun.gpx
python -m gpxcsv myrun.gpxOr specify an output file namegpxcsv myrun.gpx -o myfirstrun.csvOr, even though I named this gpxcsv, convert to a simple json file:gpxcsvmyrun.gpx--jsonpython-mgpxcsvmyrun.gpx-jpythonmyrun.gpx-oout.jsonUse thegpxtolistfunction to read the gpx file into a python list suitable for conversion into a pandas dataframe in a notebook or iPython.from gpxcsv import gpxtolist
gpx_list = gpxtolist('myfile.gpx')

#if you have pandas
import pandas as pd
df = pd.DataFrame(gpx_list)Release Notes0.2.15Fixes issue withtrklevel extension data likeDisplayColor. This will now be added to the csv file with an identifier along withtrkname.0.2.14Fixes issue with gpx files that don't have children of the extension, i.e. noTrackPointExtensioninside theExtensionstag.0.2.11Adds support for processing aStringIoobject, which was necessary to use this code as the backend for a Dash web app, which encodes all files as base64 strings.0.2.10The _try_to_float function no longer crashes when trying to floatify None. This was happening due to some odd xml in Runalyze exported GPX files.0.2.9Changed the way attribs are pulled from trackpoints. Code will not crash if trackpoint is missing lat or lon. (Obviously this shouldn't happen, but occurs in some exported workouts from Apple Watch that are missing GPS data.)0.2.8Fixed a crashing bug because of an unneccessary import accidentally auto-added.Added 0.2.7 fixes, which includes the --silent flag and better handling of missing files (skipping processing them rather than an assert error)Test GPX filesI tested the conversion against a handful of my own GPX files (exported from Apple Health / Apple Watch via the excellentHealthFit app).In addition I used several files from thissample-gpx repository, specifically:Alt_Portsmouth.gpxMoselradwegAusWiki.gpxVoieVerteHauteVosges.gpxas well as all the test files fromgpxpy. Many of those intentionally lack any coherent flow oftrk -> trkseg -> trkptso they don't produce a valid csv file.I also used abogus_basinfile (src) which is a good example of conversion of multipletrkfiles. Though, the design case was more a single workout tracked with an Apple Watch (as that's the data I'm interested in myself.)Example Input and Output:Here the beginning of atkptfrom a HealthFit/Apple HealthKit tracked run, with gps coords altered.<trk>
<type>running</type>
<trkseg>
<trkpt lat="45.0000" lon="-75.0000">
    <ele>51.0000</ele>
    <time>2021-07-21T12:37:41.000Z</time>
    <extensions>
        <gpxtpx:TrackPointExtension>
            <gpxtpx:atemp>24</gpxtpx:atemp>
            <gpxtpx:cad>72</gpxtpx:cad>
            <gpxtpx:speed>2.147612</gpxtpx:speed>
            <gpxtpx:hAcc>6.406485</gpxtpx:hAcc>
            <gpxtpx:vAcc>5.718293</gpxtpx:vAcc>
        </gpxtpx:TrackPointExtension>
    </extensions>
...This produces a CSV that begins:atemp,cad,course,ele,hAcc,hr,lat,lon,speed,time,type,vAcc
24.0,72.0,,51.0,6.406485,,45.0,-75.0,2.147612,2021-07-21T12:37:41.000Z,running,5.718293Note that thehrcolumn is not in the first trackpoint (or first several) but the header appears in the csv file.