gpt4 book ai didi

Python:类型错误: 'file' 对象没有属性 '__getitem__'

转载 作者:行者123 更新时间:2023-12-01 05:45:45 24 4
gpt4 key购买 nike

我有一个 .gpx 文件,该文件在文件中间被切断。当我尝试使用 gpxpy library 解析它时我遇到了以下错误。

Parsing points in track.gpx
ERROR:root:expected '>', line 3125, column 29
Traceback (most recent call last):
File "/usr/local/lib/python2.7/dist-packages/gpxpy-0.8.7-py2.7.egg/gpxpy/parser.py", line 209, in parse
self.xml_parser = LXMLParser(self.xml)
File "/usr/local/lib/python2.7/dist-packages/gpxpy-0.8.7-py2.7.egg/gpxpy/parser.py", line 107, in __init__
self.dom = mod_etree.XML(self.xml)
File "lxml.etree.pyx", line 2734, in lxml.etree.XML (src/lxml/lxml.etree.c:54411)
File "parser.pxi", line 1578, in lxml.etree._parseMemoryDocument (src/lxml/lxml.etree.c:82748)
File "parser.pxi", line 1457, in lxml.etree._parseDoc (src/lxml/lxml.etree.c:81546)
File "parser.pxi", line 965, in lxml.etree._BaseParser._parseDoc (src/lxml/lxml.etree.c:78216)
File "parser.pxi", line 569, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:74472)
File "parser.pxi", line 650, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:75363)
File "parser.pxi", line 590, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:74696)
XMLSyntaxError: expected '>', line 3125, column 29

File "gpxscript.py", line 370, in extractpoints gpx = gpxpy.parse(file)
File "/usr/local/lib/python2.7/dist-packages/gpxpy-0.8.7-py2.7.egg/gpxpy/__init__.py",
line 28, in parse raise mod_gpx.GPXException('Error parsing {0}: {1}'
.format(xml_or_file[0 : 100], parser.get_error()))
TypeError: 'file' object has no attribute '__getitem__'

这些是产生错误的脚本的相关命令。

368  file = open(filepath)
369 try:
370 gpx = gpxpy.parse(file)
371 except gpxpy.gpx.GPXException:
372 print "GPXException for %s." % filepath
373 return 1
<小时/>

我提交了bug for the library正如建议的那样。我在错误报告中添加了一个示例文件,该文件会产生语法错误。

最佳答案

这似乎是 gpxpy 错误处理中的一个错误。

查看 parse 的来源,当解析器失败但没有引发异常时,它会尝试引发异常:

raise mod_gpx.GPXException('Error parsing {0}: {1}'.format(xml_or_file[0 : 100], parser.get_error()))

这里假设 xml_or_file 是一个 XML 字符串,但是,顾名思义,它可以是字符串或文件对象。所以,你正在做的事情(给它一个文件对象)是完全合法的,应该可以工作,但它不能,因此这是一个错误。

所以,你应该file an issue 。正确的补丁应该是这样的:

if not parser.is_valid():
try:
fragment = xml_or_file[0 : 100]
except TypeError:
xml_or_file.seek(0)
fragment = xml_or_file.read(100)
raise mod_gpx.GPXException('Error parsing {0}: {1}'.format(fragment, parser.get_error()))
<小时/>

那么,您如何解决这个问题呢?几个选项:

  1. 由于这种情况只发生在无效文件上,因此您可以使用 except Exception except (gpxpy.gpx.GPXException, TypeError)

  2. 由于只有当您给它一个文件对象时才会发生这种情况,因此给它一个字符串:gpx = gpx.parse(file.read())。当然,如果文件非常大,这是一个坏主意。

  3. 由于 buggy 函数只是包装了真实函数的 12 行简单代码,因此直接使用真实函数即可。或者,如果您喜欢该包装器,请复制它、修复它,然后使用您自己的副本。

<小时/>

同时,考虑到我在这个库中查看的第一段代码有一些明显的危险信号(为什么使用 xml_or_file[0 : 100] 而不仅仅是 xml_or_file[:100] ?为什么要捕获异常,将它们扔掉并设置一个标志,然后使用该标志引发一个新的异常,而所有信息都丢失?),如果您无法自己调试库,我不要认为这个已经准备好供您使用。

关于Python:类型错误: 'file' 对象没有属性 '__getitem__',我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16201548/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com