gpt4 book ai didi

python - 使用 lxml 修改大型 xml 文件

转载 作者:行者123 更新时间:2023-12-01 04:15:53 25 4
gpt4 key购买 nike

语言:- Python 2.7.6

文件大小:- 1.5 GB

XML 格式

<myfeed>
<product>
<id>876543</id>
<name>ABC</name>
....
</product>

<product>
<id>876567</id>
<name>DEF</name>
....
</product>

<product>
<id>986543</id>
<name>XYZ</name>
....
</product>

我必须

A) 读取所有节点 <product>

B) 删除其中一些节点(如果 <id> 属性的文本位于 python set() 中

C) 更新/更改几个节点(如果 <id> 属性的文本位于 python 字典中

D)追加/写入一些新节点

问题是我的 XML 文件很大(大约 1.5 GB)。我做了一些研究并决定使用 lxml 来实现所有这些目的。

我尝试将 iterparse() 与 element.clear() 结合使用来实现此目的,因为它不会消耗我所有的内存。

for event, element in etree.iterparse(big_xml_file,tag = 'product'):
for child in element:
if child.tag == unique_tag:
if child.text in products_id_hash_set_to_delete: #python set()
#delete this element node

else:
if child.text in products_dict_to_update:
#update this element node
else:
print child.text
element.clear()

注意:- 我想通过一次 XML 文件扫描来完成所有这 4 项任务

问题

1) 我可以通过一次文件扫描来实现所有这些吗?

2)如果是,如何删除和更新我正在处理的元素节点?

3)我应该使用tree.xpath()吗?如果是,1.5 GB 文件会消耗多少内存,或者它的工作方式与 iterparse() 相同

我对Python的经验不是很丰富。我是Java背景的。

最佳答案

您无法就地编辑 XML 文件。您必须将输出写入新的(临时)文件,然后用新文件替换原始文件。

所以基本算法是:

  • 循环所有元素。
  • 如果要删除该节点,则继续处理下一个元素
  • 如果节点需要更改,则更改其值
  • 写出节点“<<<这是您遗漏的关键部分
  • 当您即将完成处理作为新节点之一的父节点的节点时,写出新节点,并将其从新节点集合中删除。
  • 关闭输出文件
  • 重命名。

要回答补充问题:您需要认识到 XML 文件是一个(长)字符串。如果你想插入一个字符,你必须把其他的都打乱;如果你想删除一个角色,你必须将所有其他角色都洗牌。你不能用文件来做到这一点;您不能只删除文件中间的字符。

如果您有数百万个元素(这是一个真正的问题,而不是类练习),那么您需要使用数据库。当有人说“数据库”时,我的第一个想法是 SQLite,但正如 Charles Duffy 在下面指出的那样,鉴于您已经有了 XML,XQuery 数据库可能是一个更好的起点。请参阅 BaseX 或 eXist 了解一些开源实现。

关于python - 使用 lxml 修改大型 xml 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34305878/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com