Python ElementTree.parse() from file 不关闭文件

Python ElementTree.parse() from file does not close the file

我有一个 xml 文件 - 一种用于填写参数和发出请求(创建一些数据)的模板。

我用

打开这个文件
tree = ET.parse(path_to_file)

然后我循环从文件中获取 xml,填写参数并发送请求。 但是在 2555 个请求之后我收到一条错误消息:

IOError: [Errno 24] Too many open files: 'resources/cmr/skeletons/man/CreateLiveEvent.xml'

有没有办法在 ET.parse() 打开后关闭文件?

谢谢

您可以自己打开和关闭文件:

source = open(path_to_file)
tree = ET.parse(source)
... do your work ...
source.close()

升级您的 2.7 安装。这应该是 fixed in issue #7334,并包含在 2.7.3 中。 看起来 cElementTree 实现关闭文件的方式存在错误(例如,它不会关闭文件)。

另一种方法是自己打开文件:

with open(path_to_file, 'rb') as xml_file:
    tree = ET.parse(xml_file)

并将其留给 with 语句来关闭文件对象。以 binary 格式打开文件; XML 解析器的工作是处理行尾和编码。

这不是答案,而是可能的解决方案或解决方法。

我正在处理一个大 xml 文件,240 Meg,只是在没有其他文件的情况下进行解析和搜索 activity 只是为了测量搜索数据的时间。该脚本甚至没有打印任何信息。我只有一个 print('Done.') 作为最后的最后一个陈述。当我的脚本完成后,Python 打印了 "Done." 然后挂了一会儿,而 Python 负责 GC 清理。然后,当我这样做时,我看到了明显的 Python 退出速度改进:

def search(elem):
    """Recursive"""
    # check for lots of elements

tree = ET.parse(source)
root = tree.getroot() # a large and deep element
search(root) # time it

print('Deleting tree')
del tree

# root still usable after del tree.
# You can still process the in-memory root
# at this point but I suspect not tree.write().
process(root)

print('Deleting root')
del root  # not necessary but seemed to improve exit
print('Done')

也许del tree 关闭文件。我不知道这是不是真的。我使用了 cPython。我不知道这是否与实现无关。