Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-apps-script/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在python中更改和解析大型XML文件的高效内存方法_Python_Xml_Parsing_Sax_Elementtree - Fatal编程技术网

在python中更改和解析大型XML文件的高效内存方法

在python中更改和解析大型XML文件的高效内存方法,python,xml,parsing,sax,elementtree,Python,Xml,Parsing,Sax,Elementtree,我想用python解析一个大的XML文件(25GB),并更改其中的一些元素 我尝试了xml.etree中的ElementTree,但在第一步(ElementTree.parse)时花费了太多时间 我在某个地方读到SAX很快,不会将整个文件加载到内存中,但它只是用于解析而不是修改 “iterparse”也应该仅用于解析,而不是修改 有没有其他快速且内存高效的选项?这里对您来说重要的是您需要一个流解析器,这就是sax。(python中有一个内置的sax实现,lxml提供了一个实现。)问题是,由于您试

我想用python解析一个大的XML文件(25GB),并更改其中的一些元素

我尝试了xml.etree中的ElementTree,但在第一步(ElementTree.parse)时花费了太多时间

我在某个地方读到SAX很快,不会将整个文件加载到内存中,但它只是用于解析而不是修改

“iterparse”也应该仅用于解析,而不是修改


有没有其他快速且内存高效的选项?

这里对您来说重要的是您需要一个流解析器,这就是sax。(python中有一个内置的sax实现,lxml提供了一个实现。)问题是,由于您试图修改xml文件,因此必须在读取xml文件时重写它

一个XML文件是一个文本文件,不能在文本文件中间改变一些数据而不重写整个文本文件(除非数据是完全相同的大小,这是不可能的)

您可以使用SAX读入每个元素,并注册一个事件,以便在读取和修改每个元素后将其写回。若您所做的更改非常简单,那个么甚至不用担心XML解析,只需将文本匹配到您要查找的内容,可能会更快

如果您正在处理这么大的XML文件,那么我认为您不应该使用XML文件,而应该使用数据库


您在这里遇到的问题与大型机上的Cobol程序员在处理基于文件的数据时遇到的问题相同

试试lxml,它有一些选项。修改后,是否要将其写回磁盘?还是要在修改后的树上执行操作?我想找到一些感兴趣的元素,更改它们的属性值,并将文件写入硬盘。