繁体   English   中英

使用 python 将格式奇怪的 XML 文件转换为 CSV

[英]Converting a weirdly formatted XML file to CSV using python

我有这个包含电话号码详细信息的奇怪 XML 文档,我需要将其导出到 CSV 文档中,但问题是它的格式不正确。 所有元素都在 </string> 标签内,一些“名称”字段重复但方式不完全相同(如下例所示,大多数重复行包含额外的空格或逗号)。 并且所有“数字”都从“名称”字段缩进。

        <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>

如何使用 python 将其转换为没有重复内容的 CSV 格式? 这是一个例子 output

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

当然,这是可以做到的。 如果你能用人类语言描述这个过程,你也可以对其进行编程。

例子:

  • 读取文件(逐行?还是文件适合 memory?)
  • 剥离<string></string>
    • 这条线是有意的吗? --> 否 --> 是一个键
    • 这条线是有意的吗? --> 是的 --> 它是最后一个键的值
  • 将结果添加到字典
  • 将字典写入 a.csv 文件

所以 - 你现在需要做出一些决定,比如:

导入文件很大吗? 那么它很可能装不进memory,我们需要逐行处理。 或者它适合 memory 吗?

这个程序会被多次使用吗? 还是只是一次性转换?

然后你可以将问题分成更小的子问题,并为每个子问题编写一些测试。

您还需要考虑更多情况,如文件大小、是否是一次性脚本、是否应该进行错误检查(如果有两行预期行怎么办?)等。

下面(做你需要做的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)

output

[{'key': 'example1', 'value': '014584111'}, {'key': 'example2', 'value': '04561212123'}, {'key': 'example3', 'value': '+1 156151561'}, {'key': 'example4', 'value': '564513212'}]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM