使用 Python 中的列表理解读取 GPX 文件时出现 UTF 错误

Posted

技术标签:

【中文标题】使用 Python 中的列表理解读取 GPX 文件时出现 UTF 错误【英文标题】:UTF error when reading in GPX files using list comprehension in Python 【发布时间】:2021-11-10 15:10:46 【问题描述】:

我正在尝试获取一批 GPX 文件并将它们连接到 pandas 数据帧中,然后导出为 CSV 以在其他地方进行分析 (QGIS)。

问题是,当我执行列表理解步骤时,它给了我一个 UTF-8 编码错误。我查看了其中一个 GPX 文件,它按预期在文件开头明确声明了编码。不知道我错过了什么。代码和错误信息如下。

代码

INDIR=r'/Path/to/data'
OUTDIR=r'/Path/to/data/out'
os.chdir(INDIR)

def parsegpx(f):
    #Parse a GPX file into a list of dictionaries.  
    
    points2 = []
    with open(f, 'r') as gpxfile:
        # print f
        gpx = gpxpy.parse(gpxfile)
        for track in gpx.tracks:
            for segment in track.segments:
                for point in segment.points:
                    dict = 'Timestamp' : point.time,
                            'Latitude' : point.latitude,
                            'Longitude' : point.longitude,
                            'Elevation' : point.elevation
                            
                    points2.append(dict)
    return points2

files = os.listdir(INDIR)
df2 = pd.concat([pd.DataFrame(parsegpx(f)) for f in files])

错误

<ipython-input-44-408221aa1cb1> in <module>
----> 1 df2 = pd.concat([pd.DataFrame(parsegpx(f)) for f in files])
      2 # df2.head(5)

<ipython-input-44-408221aa1cb1> in <listcomp>(.0)
----> 1 df2 = pd.concat([pd.DataFrame(parsegpx(f)) for f in files])
      2 # df2.head(5)

<ipython-input-4-8ece4e512e75> in parsegpx(f)
      6     with open(f, 'r') as gpxfile:
      7         # print f
----> 8         gpx = gpxpy.parse(gpxfile)
      9         for track in gpx.tracks:
     10             for segment in track.segments:

/usr/local/anaconda3/lib/python3.8/site-packages/gpxpy/__init__.py in parse(xml_or_file, version)
     35     from . import parser as mod_parser
     36 
---> 37     parser = mod_parser.GPXParser(xml_or_file)
     38 
     39     return parser.parse(version)

/usr/local/anaconda3/lib/python3.8/site-packages/gpxpy/parser.py in __init__(self, xml_or_file)
     68         """
     69         self.xml = ""
---> 70         self.init(xml_or_file)
     71         self.gpx = mod_gpx.GPX()
     72 

/usr/local/anaconda3/lib/python3.8/site-packages/gpxpy/parser.py in init(self, xml_or_file)
     80 
     81         """
---> 82         text = xml_or_file.read() if hasattr(xml_or_file, 'read') else xml_or_file # type: ignore
     83         if isinstance(text, bytes):
     84             text = text.decode()

/usr/local/anaconda3/lib/python3.8/codecs.py in decode(self, input, final)
    320         # decode input (taking the buffer into account)
    321         data = self.buffer + input
--> 322         (result, consumed) = self._buffer_decode(data, self.errors, final)
    323         # keep undecoded input until the next call
    324         self.buffer = data[consumed:]

UnicodeDecodeError: 'utf-8' codec can't decode byte 0x87 in position 27: invalid start byte

非常感谢任何帮助!

【问题讨论】:

这意味着该文件不是一个 UTF8 文件。您应该找出文件的代码页是什么,并使用相应的编码打开它,例如with open(f, 'r', encoding="latin1")。如果编码与文件不匹配,您将得到损坏的数据而不是错误。 您可能应该询问创建该文件的人将其保存为 UTF8。 无论文件如何描述其编码,它都不是 UTF-8。这就是信息告诉你的。打开文件并在它阻塞的字符串中计算 27 个位置。 0x87 是 Latin-1 中的双匕首符号。不幸的是,当文件不是 UTF-8 时,文件将自己声明为 UTF-8 并非闻所未闻。 明白了,感谢您的解释,现在更有意义了。因此,如果我对你们俩的理解都正确,那么我编写的代码和文件本身之间是否存在编码错误识别?所以如果我尝试像file -I 15*.gpx 这样的东西,它应该显示文件的实际编码,然后我会相应地调整我的编码参数? 【参考方案1】:

我猜你需要在打开文件时使用编码。


    with open(f, 'r', encoding="desired_encoding") as gpxfile:
       

【讨论】:

是的,对此很抱歉,但现在无法发表评论。 哦,我忘了在我的原始帖子中提到我确实尝试过。我的错。它给出了同样的错误。

以上是关于使用 Python 中的列表理解读取 GPX 文件时出现 UTF 错误的主要内容,如果未能解决你的问题,请参考以下文章

如何使用python提取.gpx数据

读取 OpenOffice xlsx 文件中的数据,然后使用 python 转换为列表

使用十六进制数据读取文件并将其存储到python中的列表中

从文件中读取列表列表作为python中的列表列表

GPX 文件不会在 Android 模拟器中加载

读取存储在文本文件中的列表[重复]