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。我不知道这是否与实现无关。
我有一个 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。我不知道这是否与实现无关。