Python - 迭代CSV行并创建XML字符串

时间:2015-06-24 21:01:54

标签: python xml csv

我有一个CSV文件,其中包含标题行,后跟可能无限数量的带值的行。例如:

FieldA,FieldB,FieldC,FieldD
1,asdf,2,ghjk
3,qwer,4,yuio
5,slslkd,,aldkjslkj

我需要做的是为每一行创建一个准XML字符串,其中元素被标记为列名,每个元素中的信息是单元格的值。使用上面的例子,如果我遍历这三行中的每一行,我最终会得到这三个字符串:

<FieldA>1</FieldA><FieldB>asdf</FieldB><FieldC>2</FieldC><FieldD>ghjk</FieldD>

<FieldA>3</FieldA><FieldB>qwer</FieldB><FieldC>4</FieldC><FieldD>yuio</FieldD>

<FieldA>5</FieldA><FieldB>slslkd</FieldB><FieldD>aldkjslkj</FieldD>

我目前的做法是:

for row in r:
    if row['FieldA']:
        fielda = '<FieldA>{0}</FieldA>'.format(row['FieldA'])
    else:
        fielda = ''

    if row['FieldB']:
        fieldb = '<FieldB>{0}</FieldB>'.format(row['FieldB'])
    else:
        fieldb = ''

    if row['FieldC']:
        fieldc = '<FieldC>{0}</FieldC>'.format(row['FieldC'])
    else:
        fieldc = ''

    if row['FieldD']:
        fieldd = '<FieldD>{0}</FieldD>'.format(row['FieldD'])
    else:
        fieldd = ''

    # Compile the string
    final_string = fielda + fieldb + fieldc + fieldd

    # Process further
    do_something(final_string)

当它遍历每一行时,会创建相应的字符串,然后我可以将其传递以进行进一步处理。

有没有更好的方法来实现我想要的,或者我的方法是最好的方法?我的猜测是有更好的,更Pythonic,更有效的方式,但我对Python来说是新的。

感谢。

3 个答案:

答案 0 :(得分:2)

修复了我遇到的问题的修改过的代码。原来是非常微不足道的:

with open(csv_file) as f:
    for row in csv.DictReader(f):
        top = Element('event')
        for k, v in row.items():
            child = SubElement(top, k)
            child.text = v
        print tostring(top)

感谢您的帮助!

答案 1 :(得分:1)

Python是Batteries Included

在这种情况下,您可以使用csv modulexml module,其代码如下所示:

# CSV module
import csv
# Stuff from the XML module
from xml.etree.ElementTree import Element, SubElement, tostring

# Topmost XML element
top = Element('top')
# Open a file
with open('stuff.csv') as csvfile:
    # And use a dictionary-reader
    for d in csv.DictReader(csvfile)
        # For each mapping in the dictionary
        for (k, v) in d.iteritems():
            # Create an XML node
            child = SubElement(top, k)
            child.text = v
print tostring(top)

答案 2 :(得分:0)

&#39;顶&#39;只是最高级别的节点 - 您可以使用任何文本来包装整个文档。

你可以非常简单地打印它: http://pymotw.com/2/xml/etree/ElementTree/create.html#pretty-printing-xml