Я смотрел на другие вопросы здесь, в SO о zip и магии *, которые очень помогли мне в понимании того, как это работает. Например:Использование zip и списков для python для преобразования xml в csv
- Why does x,y = zip(*zip(a,b)) work in Python?
- How does zip(*[iter(s)]*n) work in Python?
- Zip as a list comprehension
- XML to csv(-like) format
Хотя я до сих пор немного подумать о том, что происходит на самом деле у меня есть лучшее понимание в настоящее время. Итак, я пытаюсь преобразовать 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>
. Кроме того, если определенный элемент не имеет значения, он даже не будет существовать (например, на втором <child>
, где нет <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-й ребенок потому что у него нет элемента
<Fax>
(я полагаю). Если я ищу только для элементов, которые существуют в обоих детей, установивtags = ('Name', 'Surname')
тогда он у меня есть 2 списка назад (большой!)Это первый ребенок на самом деле имеет 2 телефонных номера, но только один возвращается
Из того, что я мог проверить, материал начинает исчезать, когда zip * входит в игру ... Как я могу установить значение по умолчанию, чтобы сохранить пустые значения?
обновления: чтобы сделать его более ясным, что я намерен делать, вот ожидаемый выходной формат CSV (с запятой в качестве разделителя, где несколько значений в каждом поле расщепляется запятой):
John;Joe;123456,654321;111111;
Tom;Cat;98765,56789;00000;;
Спасибо!
Wowww ... это прекрасно работает, но мне придется потратить немало времени, пытаясь понять все, что вы только что там сделали! Благодаря! – bergonzzi