文件中的Python ElementTree.parse()不关闭该文件

文件中的Python ElementTree.parse()不关闭该文件,python,python-2.7,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()打开文件后关闭它 谢谢您可以自己打开并关闭该

我有一个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安装。这应该是,并且包含在2.7.3中。但是,
cElementTree
实现关闭文件的方式看起来确实存在缺陷(例如,它没有关闭文件)

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

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

然后让
with
语句关闭文件对象。以二进制方式打开文件;XML解析器的工作是处理行尾和编码。

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

我正在处理一个大的xml文件,240兆,只是解析和搜索,没有其他文件活动,只是测量搜索数据的时间。脚本甚至没有打印任何信息。我只打印了一张(“完成”)作为结尾的最后一句话。当我的脚本完成时,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。我不知道这是否与实现无关。

您可以尝试自己处理文件并使用,看看这是否有什么不同。尝试打开文件,然后关闭。没有任何区别。似乎问题不在ET.parse()中,而在文件处理中更多?我尝试了这个解决方案,但没有成功:(代码是:def getRoot(self,filePath):open(filePath)为xml_file:tree=ET.parse(xml_file)root=tree.getRoot()返回root@SergiiKozlov:啊,可能是因为ElementTree以二进制模式打开文件(这是正确的)。如果仍然不起作用,您可以更具体地说明它是如何起作用的吗?您是否收到任何错误?很抱歉,响应太晚。当时可能找到了一个解决方法,但再次与之发生冲突。我的代码是:def getRoot(self,filePath):tree=ET.parse(filePath)root=tree.getroot()返回root,错误消息为:IOError:[Errno 23]系统中打开的文件太多:“mypath/RegisterContent.xml”,我正试图打开它。thanksIt看起来你没有按照我的建议进行操作。你说得对,对不起。我复制/粘贴错误。这是正确的一个,但结果仍然相同。.def getRoot(self,filePath):使用open(filePath,“r”)作为myFile:tree=ET.parse(filePath)root=tree.getroot()myFile.close()返回rootthis不总是有效的,您需要使用
open(path\u to\u文件,'rb'))
在windows中,如@Martijn Pieters所述。原因是xml文件的编码可能与ASCII不同……这将导致解析错误
xml.etree.ElementTree.ParseError:格式不正确(无效令牌):第1行第1列