将大型XML文件拆分为多个文件

时间:2019-05-08 14:40:44

标签: python xml python-3.x lxml

我尝试使用以下代码拆分大型XML文件(65GB),但需要很长时间(我认为是由于字符串连接) XML格式就像

<posts>
<row id= ....   />
<row id= ....   />
<row id= ....   />
<row id= ....   />
.
.
.
</posts>

from lxml import etree

context = etree.iterparse('Posts.xml', tag='row', events=('end', ))
index = 0
count = 0
full_text = b""
for event, elem in context:
    count += 1
    full_text += etree.tostring(elem)
    if count >= 1000000 :
        count = 0
        index += 1
        filename = format(str(index) + ".xml")
        with open(filename, 'wb') as f:
            f.write(b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
            f.write(b"<root>\n")
            f.write(full_text)
            f.write(b"</root>")
            full_text = b""
with open(format(str(index+1)+".xml"), 'wb') as f:
    f.write(b"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n")
    f.write(b"<root>\n")
    f.write(full_text)
    f.write(b"</root>")

我想将其分割成1GB的文件以进行进一步处理

有什么有效的方法可以证明以下代码的正确性?

P.S。 [相同的主题没有帮助]

1 个答案:

答案 0 :(得分:0)

我不能一路陪着你,但是下面是我的处理方法。

我将从以下内容开始:

from lxml import html
import lxml.etree as le

tree = html.fromstring(content) #content would be your whole file

然后我用这种方式计算您的tree中的节点数:

num_nodes = tree.xpath("count(//book)") #'book' in your case would be whatever the critical item is

一旦有了该数字,我将决定将这些节点划分为多少个文件。假设您有12个节点,并决定将它们分为3个文件,则节点1-4将位于file 1中,节点5-8将位于file 2中,等等。让我们专注于file 2

您需要从tree中选择分配给file 2的位置中的节点。因此,对于此文件:

low_pos=5
hi_pos=8
items = tree.xpath('//book[position()>=low_pos and position()<=hi_pos]')

这应该选择相关的节点及其所有标签,文本等。

最后,您拿走每个物品,然后按照您的意愿去做:

for item in items:
    print(le.tostring(item).decode('utf-8'))#or write or whatever

在您的情况下,显然要花很多时间才能实现它,但希望它至少是一个开始...