【发布时间】:2019-11-30 18:33:57
【问题描述】:
我有两个不同的 .xml 文件,我想创建一个程序,用 2.xml 中的子项替换 1.xml 中的子项
1.xml 看起来像这样:
<CATALOG>
<ITEM>
<COLOR>11</COLOR>
<COLORNAME>Black</COLORNAME>
</ITEM>
<ITEM>
<COLOR>41</COLOR>
<COLORNAME>Aqua</COLORNAME>
</ITEM>
<ITEM>
...
</ITEM>
</CATALOG>
2.xml 看起来像这样:
<CODES>
<ITEM>
<ITEMTYPE>P</ITEMTYPE>
<ITEMID>44</ITEMID>
<COLOR>Black</COLOR>
</ITEM>
<ITEM>
<ITEMTYPE>P</ITEMTYPE>
<ITEMID>44</ITEMID>
<COLOR>Blue</COLOR>
</ITEM>
<ITEM>
...
</ITEM>
</CODES>
我的目标是得到一个 3.xml 文件,它应该如下所示:
<CODES>
<ITEM>
<ITEMTYPE>P</ITEMTYPE>
<ITEMID>44</ITEMID>
<COLOR>11</COLOR>
</ITEM>
<ITEM>
<ITEMTYPE>P</ITEMTYPE>
<ITEMID>44</ITEMID>
<COLOR>7</COLOR>
</ITEM>
<ITEM>
...
</ITEM>
</CODES>
我现在编写了一个脚本,将 1.xml 的 <COLOR> 更改为 2.xml 的 <COLOR>,并将 2.xml 中的 <COLORNAME> 与 1.xml 中的 <COLOR> 进行比较
import xml.etree.ElementTree as ET
codes = ET.parse('./datasets/1.xml')
root_codes = codes.getroot()
colors = ET.parse('./datasets/2.xml')
root_colors = colors.getroot()
done=0
for colorname in root_codes.findall('ITEM'):
codes_color_name = colorname.find('COLOR').text
for color in root_colors.iter('ITEM'):
color_name = color.find('COLORNAME').text
if codes_color_name == color_name:
color_id = color.find('COLOR').text
colorname.find('COLOR').text = str(color_id)
codes.write('3.xml')
done=done+1
print(done)
我尝试使用 1.xml 的精简版本,它似乎可以工作。由于这真的很慢(1.xml ~300k 行和 2.xml ~3k 行)我尝试使用多处理,这就是我想出的:
import xml.etree.ElementTree as ET
from multiprocessing import Pool
import multiprocessing
import os
codes = ET.parse('./datasets/1.xml')
root_codes = codes.getroot()
colors = ET.parse('./datasets/2.xml')
root_colors = colors.getroot()
def process_item(colorname):
codes_color_name = colorname.find('COLOR').text
for color in root_colors.iter('ITEM'):
color_name = color.find('COLORNAME').text
if codes_color_name == color_name:
color_id = color.find('COLOR').text
colorname.find('COLOR').text = str(color_id)
codes.write('3.xml')
break
if __name__ == '__main__':
pool = Pool(os.cpu_count())
pool.map(process_item, root_codes.findall('ITEM'))
我用 1.xml 的精简版试过这个,它基本上吐出相同的文件,没有任何改变。有没有更有效的方法来做到这一点,或者我使用多处理的方式有什么问题?
【问题讨论】:
标签: python xml multiprocessing python-multiprocessing xml.etree