2016-10-08 8 views
0

Ich weiß, die Frage ist redundant, aber ich habe versucht, alle Python-Code, den ich gefunden und für meine Datei geändert, aber sie haben nicht funktioniert. Ich muss einen Weg finden, um meine Datei myData.csv in eine XML-Format-Datei zu konvertieren, die von einem Navigator gelesen werden kann.Convert CSV-Dokument in XML

Ich habe gerade begonnen, Python diesen Monat zu lernen, also bin ich ein Anfänger. Dies ist mein Code:

#! 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>" 
+0

Sorry, für somes unbekannten Gründen den Code und die Verbindungsdosen nicht gut erscheinen, kann mir jemand helfen, es zu reparieren, danke! – EMMAKENJI

+0

ja! Ich muss es herunterladen und dann verwenden, um es in XML zu konvertieren! – EMMAKENJI

+1

Sie sollten Ihrer Frage eine Erklärung hinzufügen und uns das Problem mitteilen, das Sie mit diesem Code haben. (Da Sie Anfänger sind, sollten Sie wahrscheinlich Python 3 lernen). –

Antwort

0

(als Antwort geschrieben, damit ich einen Codeblock zeigen kann)

Es gibt viele picky Details sind als XML zu schreiben. In Python sollten Sie wahrscheinlich eine Version von ElementTree verwenden, um damit zu helfen. Ein gutes Tutorial ist Creating XML Documents. Zitiert von dort:

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)) 

Wenn Sie dies als ein Beispiel dafür, wie ein Baum von XML-Elementen zu erstellen, sollten Sie in der Lage sein, Ihren Code in die XML-Struktur zu übersetzen Sie benötigen.

1

Ziehen Sie in Erwägung, Ihr XML mit dedizierten DOM-Objekten zu erstellen und keine Verkettung von Zeichenfolgen, die Sie mit dem lxml-Modul ausführen können. Mit Methoden wie Element(), SubElement() usw. Sie iterativ XML-Struktur aus dem Lesen von CSV-Daten aufbauen können:

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) 

Ausgabe

<?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> 
    ... 
+0

Vielen Dank! aber wenn ich Ihren Code versucht, das Terminal retruning mich: Traceback (letzten Anruf zuletzt): Datei "Test. py ", Zeile 22, in Knoten = ET.SubElement (Daten, Header [col]). text = str (Zeile [col]) IndexError: Listenindex außerhalb des Bereichs – EMMAKENJI

+0

Überprüfen Sie, ob die Header = [.. .] Zeile entspricht Spalten in der tatsächlichen CSV. Diese Lösung verwendet die in Link oben. Möglicherweise arbeiten Sie mit einer anderen Version. Und bitte beachten Sie, dass XML-Tags keinen Platz oder Sonderzeichen als CSV haben können. Sehen Sie, wie ich Unterstreichung verwendet für * 'Adresse_complète' *. – Parfait