Python:TypeError:“file”对象没有属性''

2024-09-28 19:31:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个.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__'

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

^{pr2}$

我按照建议提交了一份bug for the library。我在bug报告中添加了一个示例文件,它会产生语法错误。在


Tags: 文件inpyselfsrcparserusrline
1条回答
网友
1楼 · 发布于 2024-09-28 19:31:57

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

查看^{}的源代码,当解析器在未引发异常的情况下失败时,它将尝试使用以下内容引发异常:

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

这假设xml_or_file是一个XML字符串,但顾名思义,它可以是字符串或文件对象。所以,你所做的(给它一个file对象)是完全合法的,应该可以正常工作,但是它没有,因此这是一个bug。在

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

^{pr2}$

那么,你怎么解决这个问题呢?一些选项:

  1. 因为它只在无效文件中发生,所以可以使用except Exception或{}。

  2. 因为它只在您给它一个文件对象时发生,所以给它一个字符串:gpx = gpx.parse(file.read())。当然,如果文件非常大,这是个坏主意。

  3. 因为buggy函数只有12行包装实数函数的简单代码,所以直接使用real函数就可以了。或者,如果你喜欢包装,复制它,修复它,然后使用你自己的副本。


同时,考虑到我在这个库中看到的第一段代码有一些明显的危险信号(为什么xml_or_file[0 : 100]而不是{}?为什么要捕捉异常,丢弃它们,只设置一个标志,然后使用该标志引发一个新的异常,而所有信息都丢失了?),如果你不能自己调试库,我认为这个库不适合你使用。在

相关问题 更多 >