gpt4 book ai didi

python - 如何使用 Python 删除部分 XML 数据并将其写入新文件

转载 作者:行者123 更新时间:2023-12-04 03:41:58 25 4
gpt4 key购买 nike

我有一个数据结构,如下所示。输入文件非常大,因此我正在尝试找到一种有效的方法。

<?xml version='1.0' encoding='UTF-8'?>
<corpus name="corpus">
<recording audio="audio.wav" name="first audio">
<segment name="1" start="0" end="2">
<orth>some text 1</orth>
</segment>
<segment name="2" start="2" end="4">
<orth>some text 2</orth>
</segment>
<segment name="3" start="4" end="6">
<orth>some text 3</orth>
</segment>
</recording>
</corpus>

给定一个包含多个文件的输入文件,例如

1
3

它将删除具有那些name 的段。例如,给出了 1 和 3,因此名称为 1 和 3 的段已被删除。

<?xml version='1.0' encoding='UTF-8'?>
<corpus name="corpus">
<recording audio="audio.wav" name="first audio">
<segment name="2" start="2" end="4">
<orth>some text 2</orth>
</segment>
</recording>
</corpus>

我目前的代码

from lxml import etree

with open("g.xml", "r") as xml_file:
xml_data = xml_file.read()

with open('del_names.txt', 'r') as file:
list_of_names = file.read().split("\n")

new_xml = xml_data
for each_name in list_of_names:
print(each_name)
tree = etree.XML(new_xml.encode())
find_segments = tree.xpath("*//segment[@name='{}']".format(each_name))
for each_segment in find_segments:
each_segment.getparent().remove(each_segment)
new_xml = str(etree.tostring(tree, pretty_print=True, xml_declaration=True), encoding="utf-8")

print(new_xml)

代码的问题是,我现在运行代码 2 小时,它甚至没有输出一行。我不确定我可以用什么有效的方法来做到这一点。

我该如何实现?我还认为有 2 个可能是不必要的,对吗?

最佳答案

如果您的代码花费的时间比预期的要长,您始终可以从一些打印语句开始,以便更好地了解时间是否花费了。

对于您的任务,一个循环就足够了。遍历 xml 文件中的所有“段”元素。当段的名称包含在 del_names.txt 文件中时,将其删除。

为了更快地查找姓名,我将姓名列表转换为集合

from lxml import etree

with open("g.xml", "r") as xml_file:
xml_data = xml_file.read()
print("read xml data")

with open('del_names.txt', 'r') as file:
names_to_delete = set(file.read().split("\n"))
print("read text data")

new_xml = xml_data
tree = etree.XML(new_xml.encode())

for segment in tree.xpath("*//segment"):
name = segment.attrib.get("name")
if name in names_to_delete:
print(f"will delete segment '{name}'")
segment.getparent().remove(segment)

print(" result ".center(80, "="))

new_xml = str(etree.tostring(tree, encoding="unicode", pretty_print=True))
print(new_xml)

输出:

read xml data
read text data
will delete segment '1'
will delete segment '3'
==================================== result ====================================
<?xml version='1.0' encoding='ASCII'?>
<corpus name="corpus">
<recording audio="audio.wav" name="first audio">
<segment name="2" start="2" end="4">
<orth>some text 2</orth>
</segment>
</recording>
</corpus>

关于python - 如何使用 Python 删除部分 XML 数据并将其写入新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65876287/

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