我尝试使用以下代码拆分大型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。 [相同的主题没有帮助]
答案 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
在您的情况下,显然要花很多时间才能实现它,但希望它至少是一个开始...