在Python中转换为XML时从CSV数据中剥离标题
我正在学习如何解析CSV文件,并使用ElementTree和minidom(用于漂亮的打印)将数据格式化为XML文件。我离得太近了,但碰到了一个小障碍,我似乎无法回过头来。我有以下代码:在Python中转换为XML时从CSV数据中剥离标题,python,csv,elementtree,Python,Csv,Elementtree,我正在学习如何解析CSV文件,并使用ElementTree和minidom(用于漂亮的打印)将数据格式化为XML文件。我离得太近了,但碰到了一个小障碍,我似乎无法回过头来。我有以下代码: for csvFile in directory: root = Element('Order') with open(csvFile, 'rt') as f: reader = csv.reader(f) for row in reader:
for csvFile in directory:
root = Element('Order')
with open(csvFile, 'rt') as f:
reader = csv.reader(f)
for row in reader:
queue = row[0]
token = row[1]
current_order = SubElement(root, 'Token', {'text':token})
details = SubElement(current_order, 'Queue',
{'queue':queue})
print prettify(root)
它生成以下XML:
<?xml version="1.0" ?>
<Order>
<Token text="token">
<Queue queue="site_code"/>
</Token>
<Token text="H54FC9">
<Queue queue="Duplex_N-up"/>
</Token>
</Order>
如何从CSV输入中剥离标题,使XML如下所示:
<?xml version="1.0" ?>
<Order>
<Token text="H54FC9">
<Queue queue="Duplex_N-up"/>
</Token>
</Order>
谢谢大家! 是否要放弃csv文件中的第一行?如果是这样,您可以很容易地做到:
for csvFile in directory:
root = Element('Order')
with open(csvFile, 'rt') as f:
junk = next(f) #read the first line, don't do anything with it.
reader = csv.reader(f)
for row in reader:
queue = row[0]
token = row[1]
current_order = SubElement(root, 'Token', {'text':token})
details = SubElement(current_order, 'Queue',
{'queue':queue})
print prettify(root)
是否要放弃csv文件中的第一行?如果是这样,您可以很容易地做到:
for csvFile in directory:
root = Element('Order')
with open(csvFile, 'rt') as f:
junk = next(f) #read the first line, don't do anything with it.
reader = csv.reader(f)
for row in reader:
queue = row[0]
token = row[1]
current_order = SubElement(root, 'Token', {'text':token})
details = SubElement(current_order, 'Queue',
{'queue':queue})
print prettify(root)
如果您的CSV文件总是有头,请在
reader=CSV.reader(f)
之后调用reader.next()
如果您的CSV文件总是有头,请在reader=CSV.reader(f)
之后调用reader.next()
。或者,特别是如果列标题应该与XML节点的名称相同,请使用DictReader
,它将第一行作为标题而不是值读取,然后让您执行行['Queue']
而不是行[0]
,等等。(这可能是一个有用的检查,以确保列符合您的期望,或者是一种更灵活的方法,在不同形状的CSV文件的XML输出不同的情况下)。@DrydenLong这是一个品味问题,但我会选择islice中的行的(reader,1,None)
我发现更明显的是,我故意跳过一行,如果需要,可以很容易地更改为跳过多行。感谢@Jon Clements,这是有意义的。我喜欢调整被跳过行的数量的能力。+1。或者,特别是如果列标题应该与XML节点的名称相同,请使用DictReader
,它将第一行作为标题而不是值读取,然后让您执行行['Queue']
而不是行[0]
,等等(这是一种有用的检查,可以确保列符合您的预期,或者是一种在不同形状的CSV文件的XML输出不同时执行更灵活操作的方法)@DrydenLong这是一个品味的问题,但我会选择作为islice中的行(reader,1,无)
我发现更明显的是我故意跳过了一行,如果需要可以很容易地更改为跳过多行。谢谢@Jon Clements,这很有意义。我喜欢调整被跳过行的数量的能力。@mgilson:+1。使用下一步(阅读器)
也意味着您的代码在调用reader.next()
/reader时可以同时使用Py2和Py3。
显然只能使用其中一个。@abarnert--是的,我以为他们在3.0中做了更改(我只是懒得去查找它,所以我选择了更简单但不太健壮的--“惯用”参数)@mgilson:+1.使用next(reader)
也意味着您的代码可以同时使用Py2和Py3,同时调用reader.next()
/reader.\uuuuuuuuuuu next()
显然只能使用其中一个。@abarnert--是的,我以为他们在3.0中做了这样的更改(我只是懒得去查,所以我又回到了更简单但不那么有力的“惯用”论点上来)