You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:06:02