我有一个xml文件 - 一种模板,用于填充参数并发出请求(创建一些数据)。
我用
打开这个文件tree = ET.parse(path_to_file)
我循环从文件中获取xml,填充参数并发送请求。 但在2555次请求后,我收到一条错误消息:
IOError: [Errno 24] Too many open files: 'resources/cmr/skeletons/man/CreateLiveEvent.xml'
有没有办法在ET.parse()打开它之后关闭文件?
由于
答案 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。我不知道这是否与实现无关。