我有如下数据结构。输入文件相当大,因此我试图找到一种有效的方法
<?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个可能是不必要的,对吗
如果您的代码花费的时间比预期的要长,您总是可以从一些print语句开始,以便更好地了解所花费的时间
对于您的任务,一个循环就足够了。迭代xml文件中的所有“段”元素。当段的名称包含在del_names.txt文件中时,将其删除
为了更快地查找名称,我将名称列表转换为
set
输出:
您还可以使用
BeautifulSoup
:相关问题 更多 >
编程相关推荐