使用 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 错误的主要内容,如果未能解决你的问题,请参考以下文章