Я просматривал другие вопросы здесь, в SO, о zip и магии *, которые очень помогли мне понять, как это работает. Например:
- Почему x,y = zip(*zip(a,b)) работаете на Python?
- Как работает zip(*[iter(s)]*n) в Python? а>
- Заархивируйте как список
- Формат XML в csv (подобный)
Несмотря на то, что мне все еще нужно немного подумать о том, что происходит на самом деле, теперь я лучше понимаю. Итак, чего я пытаюсь добиться, так это преобразовать документ 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;;
Спасибо!