私はここSOでzipと魔法についての他の質問を見てきました*。これは、それがどのように機能するかを理解するのに大いに役立ちました。例えば:
- x,y = zip(*zip(a,b)) が Python で機能するのはなぜですか?
- zip(*[iter(s)]*n) は Python でどのように機能しますか?
- リスト内包表記として Zip
- XML から csv(-like) 形式へ
実際に何が起こっているのかについてはまだ少し考えなければなりませんが、今では理解が深まっています。私が達成しようとしているのは、xmlドキュメントをcsvに変換することです。上記の最後のリンクは、私がやりたいことに非常に近いものですが、私のソース xml は最も一貫した構造を持っておらず、それが私が壁にぶつかっているところです。ソース xml の例を次に示します (この例のために簡略化しています)。
<?xml version="1.0" encoding="utf-8"?>
<root>
<child>
<Name>John</Name>
<Surname>Doe</Surname>
<Phone>123456</Phone>
<Phone>654321</Phone>
<Fax>111111</Fax>
</child>
<child>
<Name>Tom</Name>
<Surname>Cat</Surname>
<Phone>98765</Phone>
<Phone>56789</Phone>
<Phone>00000</Phone>
</child>
</root>
ご覧のとおり、 の下に 2 つ以上の同じ要素を含めることができます<child>
。また、特定の要素に値がない場合、それは存在しません (2 番目<child>
に no がない場合のように<Fax>
)。
これは私が現在持っているコードです:
data = etree.parse(open('test.xml')).findall(".//child")
tags = ('Name', 'Surname', 'Phone', 'Fax')
for child in data:
for a in zip(*[child.findall(x) for x in tags]):
print([x.text for x in a])
>> Result:
['John', 'Doe', '123456', '111111']
これにより、csv の書き込みに使用できる形式が得られますが、次の 2 つの問題があります。
要素がないため、2番目の子をスキップし
<Fax>
ます(私はそう思います)。設定して両方の子に存在する要素のみを検索すると、tags = ('Name', 'Surname')
2 つのリストが返されます (すばらしい!)その最初の子には実際には 2 つの電話番号がありますが、返されるのは 1 つだけです
私がテストできることから、zip * が機能すると、ものが消え始めます...空の値を保持できるように、デフォルト値を設定するにはどうすればよいですか?
更新:私が何をしようとしているのかをより明確にするために、予想される出力形式を次に示します(各フィールドの複数の値がカンマで区切られたセミコロン区切りのCSV):
John;Joe;123456,654321;111111;
Tom;Cat;98765,56789;00000;;
ありがとう!