我有一个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来说是新的。
感谢。
答案 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
module和xml
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