2

多くの作業を節約しながら、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', )
4

1 に答える 1

0

treeを反復処理して、それぞれlogical_devidが にあるかどうかを確認する方が理にかなっていると思いますdlogical_devid変数 (たとえば、old_devid) を取得したら、次のようにします。

new_devid = d.get(old_devid)

交換品があるかどうかを確認します。だったらnew_devid is null辞書にない。それ以外の場合は、ツリー内new_devidの現在の値を置き換える必要があります。logical_devid

于 2013-06-16T02:25:08.033 に答える