【问题标题】:Convert CSV document to XML将 CSV 文档转换为 XML
【发布时间】:2017-02-17 05:07:41
【问题描述】:

我知道这个问题是多余的,但我尝试了我为我的文件找到并修改的所有 Python 代码,但它们不起作用。我需要找到一种方法将我的文件myData.csv 转换为导航器可以读取的 XML 格式文件。

我这个月才开始学习 Python,所以我是初学者。这是我的代码:

#! usr/bin/python
# -*- coding: utf-8 -*-
import csv, sys, os
from lxml import etree


csvFile = 'myData.csv' # création de la variable pour le fichier csv
reader= csv.reader(open(csvFile), delimiter=';', quoting=csv.QUOTE_NONE) # création d'une variable reader à qui on renvoie le tableau csv

print "<data>"
for record in reader:
    if reader.line_num == 1:
        header = record
    else:
        innerXml = ""
        dontShow = False
        type = ""
        for i, field in enumerate(record):
            innerXml += "<%s>" % header[i].lower() + field + "</%s>" % header[i].lower()
            if i == 1 and field == "0":
                type = "Next"
            elif type == "" and i == 3 and field == "0":
                type = "Next"
            elif type == "" and i == 3 and field != "0":
                type = "film"

            if i == 1 and field == "X":
                dontShow = True

        if dontShow == False:
            xml = "<%s>" % type
            xml += innerXml
            xml += "</%s>" % type
            print xml
print "</data>"

【问题讨论】:

  • 对不起,由于某些未知原因,代码和链接看起来不太好,谁能帮我解决一下,谢谢!
  • 是的!我需要下载它然后用它来转换成xml!
  • 您应该为您的问题添加一些解释,告诉我们您在使用该代码时遇到的问题。 (另外,由于您是初学者,您可能应该学习 Python 3)。
  • 但是我们使用python 2或者python 3。老师没有指定我们应该使用哪一个!一些使用 3 其他 2. (对不起我的英语,我不是英语的母语人士

标签: python xml csv


【解决方案1】:

导入pandas并保存文件名:

import pandas as pd
csvFile = 'myData.csv'

以下将CSV读入pandas数据框,然后转换为XML。

df = pd.read_csv(path)
df_xml = df.to_xml()

以下代码将创建一个新文件,然后将 XML 数据保存到名为“csv2xml”的文件中

f = open("csv2xml.xml", "w")
f.write(df_xml)
f.close()

【讨论】:

    【解决方案2】:

    考虑使用专用的 DOM 对象而不是字符串的串联来构建您的 XML,您可以使用 lxml 模块执行此操作。使用Element()SubElement()等方法,可以通过读取CSV数据迭代构建XML树:

    import csv
    import lxml.etree as ET
    
    headers = ['Titre', 'Realisateur', 'Date_Debut_Evenement', 'Date_Fin_Evenement', 'Cadre',
               'Lieu', 'Adresse', 'Arrondissement', 'Adresse_complète', 'Geo_Coordinates']
    
    # INITIALIZING XML FILE
    root = ET.Element('root')
    
    # READING CSV FILE AND BUILD TREE
    with open('myData.csv') as f:
        next(f)                             # SKIP HEADER
        csvreader = csv.reader(f)
    
        for row in csvreader:        
            data = ET.SubElement(root, "data")
            for col in range(len(headers)):
                node = ET.SubElement(data, headers[col]).text = str(row[col])
    
    # SAVE XML TO FILE
    tree_out = (ET.tostring(root, pretty_print=True, xml_declaration=True, encoding="UTF-8"))
    
    # OUTPUTTING XML CONTENT TO FILE
    with open('Output.xml', 'wb') as f:
        f.write(tree_out)
    

    输出

    <?xml version='1.0' encoding='UTF-8'?>
    <root>
      <data>
        <Titre>1</Titre>
        <Realisateur>BUS PALLADIUM</Realisateur>
        <Date_Debut_Evenement>CHRISTOPHER THOMPSON</Date_Debut_Evenement>
        <Date_Fin_Evenement>21 mai 2009</Date_Fin_Evenement>
        <Cadre>21 mai 2009</Cadre>
        <Lieu>EXTERIEUR</Lieu>
        <Adresse>PLACE</Adresse>
        <Arrondissement>PIGALLE</Arrondissement>
        <Adresse_complète>75018</Adresse_complète>
        <Geo_Coordinates>PLACE PIGALLE 75018 Paris France</Geo_Coordinates>
      </data>
      <data>
        <Titre>2</Titre>
        <Realisateur>LES INVITES DE MON PERE</Realisateur>
        <Date_Debut_Evenement>ANNE LE NY</Date_Debut_Evenement>
        <Date_Fin_Evenement>20 mai 2009</Date_Fin_Evenement>
        <Cadre>20 mai 2009</Cadre>
        <Lieu>DOMAINE PUBLIC</Lieu>
        <Adresse>SQUARE</Adresse>
        <Arrondissement>DU CLIGNANCOURT</Arrondissement>
        <Adresse_complète>75018</Adresse_complète>
        <Geo_Coordinates>SQUARE DU CLIGNANCOURT 75018 Paris France</Geo_Coordinates>
      </data>
      <data>
        <Titre>3</Titre>
        <Realisateur>DEMAIN, A L'AUBE</Realisateur>
        <Date_Debut_Evenement>GAEL CABOUAT</Date_Debut_Evenement>
        <Date_Fin_Evenement>17 avril 2009</Date_Fin_Evenement>
        <Cadre>17 avril 2009</Cadre>
        <Lieu>EXTERIEUR</Lieu>
        <Adresse>RUE</Adresse>
        <Arrondissement>QUINCAMPOIX</Arrondissement>
        <Adresse_complète>75004</Adresse_complète>
        <Geo_Coordinates>RUE QUINCAMPOIX 75004 Paris France</Geo_Coordinates>
      </data>
      ...
    

    【讨论】:

    • 谢谢!但是当我尝试你的代码时,终端正在重新运行我: Traceback(最近一次调用最后一次):文件“test.py”,第 22 行,在 node = ET.SubElement(data, headers[col]).text = str(row[col]) IndexError: 列表索引超出范围
    • 检查headers = [...] 行是否与实际 CSV 中的列匹配。此解决方案使用上面链接中的那个。可能,您正在使用不同的版本。请注意 XML 标签不能像 CSV 那样包含空格或特殊字符。看看我如何在 'Adresse_complète' 中使用下划线。
    【解决方案3】:

    (作为答案发布,以便我可以显示代码块)

    在编写 XML 时有很多挑剔的细节。在 Python 中,您可能应该使用某些版本的 ElementTree 来帮助解决这个问题。一个很好的教程是Creating XML Documents。从那里引用:

    from xml.etree.ElementTree import Element, SubElement, Comment, tostring
    
    top = Element('top')
    
    comment = Comment('Generated for PyMOTW')
    top.append(comment)
    
    child = SubElement(top, 'child')
    child.text = 'This child contains text.'
    
    child_with_tail = SubElement(top, 'child_with_tail')
    child_with_tail.text = 'This child has regular text.'
    child_with_tail.tail = 'And "tail" text.'
    
    child_with_entity_ref = SubElement(top, 'child_with_entity_ref')
    child_with_entity_ref.text = 'This & that'
    
    print(tostring(top))
    

    如果您将此作为如何创建 XML 元素树的示例,您应该能够将您的代码转换为您需要的 XML 结构。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-05
      • 2015-10-28
      • 2014-11-22
      • 2017-04-18
      • 2015-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多