来自文件的Python ElementTree.parse()不会关闭该文件

时间:2015-01-22 12:31:41

标签: python python-2.7

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

我用

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

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

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

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

由于

3 个答案:

答案 0 :(得分:9)

升级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解析器的工作是处理行结尾和编码。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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

我当时正在处理一个240 Meg的大型xml文件,它只是在没有其他文件活动的情况下进行解析和搜索,只是为了测量搜索数据的时间。该脚本甚至没有打印任何信息。最后,我只有一张印刷品(“完成”。)。完成脚本后,Python会打印“完成”。然后挂了一会儿,而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。我不知道这是否与实现无关。