Python使用列表推导式读取GPX文件时出现UTF-8编码错误
解决方案
问题根因
报错由两个常见原因触发:
os.listdir()会返回目标目录下所有条目,包括子目录、非GPX文件(你代码中定义的OUTDIR就在INDIR路径下,会被当成文件传入解析函数,读取目录必然触发编码错误)open()未指定编码策略,Python3默认使用系统默认编码读取文件,就算GPX头部声明了UTF-8,只要文件内存在少量异常非UTF-8字符(比如设备导出时的乱码、其他编码嵌入内容)就会抛出解码错误。
修复后代码
import os import pandas as pd import gpxpy INDIR = r'/Path/to/data' OUTDIR = r'/Path/to/data/out' os.chdir(INDIR) def parsegpx(f): points2 = [] # 方案1:指定UTF-8编码,忽略非法字符,绝大多数场景可用 with open(f, 'r', encoding='utf-8', errors='ignore') as gpxfile: gpx = gpxpy.parse(gpxfile) # 方案2:如果方案1还是报错,改用二进制读取,交给gpxpy自行处理解码 # with open(f, 'rb') as gpxfile: # gpx = gpxpy.parse(gpxfile) for track in gpx.tracks: for segment in track.segments: for point in segment.points: point_dict = { 'Timestamp': point.time, 'Latitude': point.latitude, 'Longitude': point.longitude, 'Elevation': point.elevation } points2.append(point_dict) return points2 # 只筛选后缀为gpx的文件,排除目录和其他非GPX文件 files = [f for f in os.listdir(INDIR) if f.lower().endswith('.gpx') and os.path.isfile(f)] df2 = pd.concat([pd.DataFrame(parsegpx(f)) for f in files]) # 导出CSV时指定utf-8-sig编码,兼容QGIS的中文读取逻辑 df2.to_csv(os.path.join(OUTDIR, 'merged_gpx.csv'), encoding='utf-8-sig', index=False)
额外说明
- 如果部分GPX文件明确使用GBK/GB2312编码,把
encoding='utf-8'修改为对应编码即可 errors='ignore'会跳过无法解码的字符,不会影响轨迹核心坐标、时间、高程字段的解析
内容的提问来源于stack exchange,提问作者Graham Oxman
相关产品推荐
相关产品推荐

