多くの作業を節約しながら、Python を学ぼうとしています。
古いデバイス ID を新しいデバイス ID にマッピングする xml ファイルと辞書ファイルがあります。
ツリーを反復処理し、辞書キーに一致するすべての logical_devid の子に対して、または各辞書キーに対して対応する logical_devid を見つけようとしています。いずれの場合も、logical_devid.text を新しい値に置き換えます。
例: xml スニペット
<lun>
<pseudo_dev>emcpower146a</pseudo_dev>
<udev>0x12b00000490</udev>
<product_id>symmetrix</product_id>
<frame_id>000192604705</frame_id>
<logical_devid_type>symm_id</logical_devid_type>
<logical_devid>0A43</logical_devid>
</lun>
のテキストファイル
0A40 0127
0A41 0128
0A42 0129
0A43 012A
XML ファイルを ElementTree オブジェクトとしてロードし、テキスト ファイルをディクショナリにロードしました。
import xml.etree.cElementTree as ET
tree = ET.ElementTree(file='emcpower.mappings')
d = {}
with open("translate-table.txt") as f:
for line in f:
(old, new) = line.split()
d[(old)] = new
elem.text を反復して置き換える最良の方法を見つけようとして立ち往生しています。最良の方法は、辞書内の既知の変更を反復することだと思います。
for old_devid, new_devid in d.iteritems():
次に、old_devid に一致する子 logical_devid に対してある種の xml 検索を実行し、elem.text を new_devid に設定します。
これは、私が望むほとんどのことを行う完全なスクリプトです:
#!/usr/bin/python
try:
import xml.etree.cElementTree as ET
except ImportError:
import xml.etree.ElementTree as ET
#read in emcpower.mappings file as an entire xml tree of elements
tree = ET.ElementTree(file='emcpower.mappings')
# this defines a dictionary with the contents of the translate table which
# is simply the old device ID as key and new device id as value
d = {}
with open("translate-table.txt") as f:
for line in f:
(old, new) = line.split()
d[(old)] = new
for elem in tree.iterfind('lun/logical_devid'):
old_devid = elem.text
new_devid = d.get(old_devid)
try:
new_devid
except NameError:
new_devid = None
else:
if new_devid:
elem.text = new_devid
print "The logical_devid will be changed to", elem.text
tree.write('emcpower.mappings.new', )