在Python中转换为XML时从CSV数据中剥离标题

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

我正在学习如何解析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:
            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中做了这样的更改(我只是懒得去查,所以我又回到了更简单但不那么有力的“惯用”论点上来)