Преобразование странно отформатированного XML-файла в CSV с помощью Python

У меня есть этот странный XML-документ, содержащий сведения о номере телефона, мне нужно экспортировать его в документ CSV, но проблема в том, что он неправильно отформатирован. Все элементы находятся внутри тегов , а некоторые поля "Name" повторяются, но не одинаково (как в приведенном ниже примере, большинство повторяющихся строк содержат лишние пробелы или запятые). И все "числа" имеют отступ от полей "Имя".

        <string>example1</string>
            <string>014584111</string>

        <string>example2</string>
            <string>04561212123</string>

        <string>example3</string>
            <string>+1 156151561</string>

        <string>example4</string>
            <string>564513212</string>
        
        <string>example3, </string>
        <string>example4  </string>

Как я могу преобразовать это в формат CSV без повторяющегося содержимого с помощью Python? Вот пример вывода

FullName  PhoneNumber
  
example1  014584111
example2  014584111    
example3  +1 156151561  
example4  564513212 

2 ответа

Конечно, это можно сделать. Если Вы можете описать процесс на человеческом языке, Вы также можете его запрограммировать.

Пример:

  • прочитать файл (построчно? или файл умещается в памяти?)
  • сдирать <string> а также </string>
    • линия предназначена? -> Нет -> Это ключ
    • линия предназначена? -> Да -> Это значение до последнего ключа
  • добавить результаты в диктант
  • напишите dict в файл.csv

Итак - сейчас вам нужно принять несколько решений, например:

Файл импорта огромен? Тогда он, вероятно, не влезет в память, и нам придется обрабатывать построчно. Или в память поместится?

Эта программа понадобится много раз? Или это всего лишь разовая конверсия?

Затем вы можете разделить проблемы на более мелкие подзадачи и написать несколько тестов для каждой подзадачи.

Вам также нужно учитывать больше обстоятельств, таких как размер файла, если это одноразовый сценарий, если должна быть проверка ошибок (что, если есть две предполагаемые строки?) И т. Д.

Ниже (сделайте то, что вам нужно сделать с data)

import xml.etree.ElementTree as ET

def is_phone_number(value):
    for x in value:
        if x != '+' and x != ' ' and not x.isnumeric():
            return False
    return True
    
xml = '''<r> <string>example1</string>
            <string>014584111</string>

        <string>example2</string>
            <string>04561212123</string>

        <string>example3</string>
            <string>+1 156151561</string>

        <string>example4</string>
            <string>564513212</string>
        
        <string>example3, </string>
        <string>example4  </string></r>'''
data = []
root = ET.fromstring(xml)
strings = root.findall('.//string')
i = 0
while i < len(strings):
    if is_phone_number(strings[i+1].text):
        data.append({'key': strings[i].text,'value':strings[i+1].text})
    i += 2

print(data)

выход

[{'key': 'example1', 'value': '014584111'}, {'key': 'example2', 'value': '04561212123'}, {'key': 'example3', 'value': '+1 156151561'}, {'key': 'example4', 'value': '564513212'}]
Другие вопросы по тегам