2016-07-26 11 views
0

Ich habe eine CSV mit Werten, die ich in einer XML-Vorlage ersetzen möchte. Generierung XMLs für jede Zeile, die Dateinamen basierend auf Daten in derselben Zeile haben. Dies sind im Grunde nur Kopien der Vorlage mit einem Suchen und Ersetzen. Bis jetzt habe ich die Dateinamen erhalten, um richtig zu arbeiten, aber die XML-Datei ersetzt seine Daten nicht entsprechend der Zeile, sondern ersetzt nur Daten aus Zeile 3, Spalte 10. Ich suche nach einer Iteration durch eine Reihe von Zeilen und Erstelle für jede neue Dateien. Ich bin ratlos, was hier falsch läuft.Python - Iterieren durch CSV-Zeilen und ersetzen in XML

CSV Snippet:

COLUMN_K, COLUMN_L 
K02496.ai, Test 
K02550.ai, Test 
K02686.ai, Test 
K02687.ai, Test 

Vorhandene XML-Vorlage Snippet

<gmd:resourceFormat> 
    <gmd:MD_Format> 
     <gmd:name> 
     <gco:CharacterString>COLUMN_K</gco:CharacterString> 
     </gmd:name> 

Python-Code

import csv 

exampleFile = open('U:\PROJECTS\Technical Graphics\metadata.csv') 
exampleReader = csv.reader(exampleFile) 
exampleData = list(exampleReader) #CSV as list 

with open('U:\PROJECTS\Technical Graphics\COLUMN_K_edited.xml') as inputfile: #template XML 
    xml = inputfile.read() 

with open('U:\PROJECTS\Technical Graphics\metadata.csv') as csvfile: 
    for row in reader(csvfile, delimiter=';'): 
     for i in range(5): #range of 5 rows 
      xml = xml.replace('COLUMN_K', exampleData[i+3][10]) 
#Only taking value from row 3, COLUMN_K- Need values from row 3 on 
      xml = xml.replace('COLUMN_L', exampleData[i+3][11]) 
#Only taking value from row 3, COLUMN_L- Need values from row 3 on  
      with open('U:\PROJECTS\Technical Graphics\XXX' + str((exampleData[i+3][10])) + ".xml", 'w') as outputfile: 
#Correctly outputs multiple filenames based on COLUMN_K value 
       outputfile.write(xml) #writes multiple XMLs 
+0

Aktualisierung mit einem [minimalen, vollständigen, überprüfbaren Beispiel] (http://stackoverflow.com/help/mcve). So wie es ist, kann ich nicht nachvollziehen, was der Ein- und Ausgang sein soll. Zum Beispiel wird der Leser mit einem Semikolon-Trennzeichen geöffnet, aber in den Beispielen ist kein Semikolon vorhanden. Es gibt keine zu ersetzende 'COLUMN_E'. –

+0

Entschuldigung. Ich werde von nun an diesem Protokoll folgen und das Beispiel jetzt bearbeiten. – MapZombie

Antwort

0

Sie haben erwähnt 'COLUMN_F' im XML-Tag und Sie versuchen, 'COLUMN_E' im Code

xml = xml.replace ('COLUMN_E', exampleData [i + zu ersetzen 3] [10])

+0

Nur mit denen als Beispiele. Wird Baucodes für jede der "COLUMN_X" sein. Ich werde es jetzt reparieren, damit es besser liest. – MapZombie

+0

Grundsätzlich entspricht jeder der COLUMN_X in der CSV einem "COLUMN_X" innerhalb der XML-Vorlage. Diese werden durch die CSV-Werte ersetzt und generieren neue XML-Dateien. – MapZombie

0

Ich konnte das Problem lösen, indem ich die Schleife ganz nach oben verlagerte. Das Problem war, dass es den Text ersetzt hat, aber dann konnte "COLUMN_ *" nicht gefunden werden, da es durch einen Wert ersetzt wurde. Durch Verschieben der Schleife nach oben wurde dies gelöst.

import csv 

    for i in range(5): #loops through 5 rows 
     exampleFile = open('U:\PROJECTS\Technical Graphics\metadata.csv') #CSV file 
     exampleReader = csv.reader(exampleFile) 
     exampleData = list(exampleReader) #turns CSV into list 

     with open('U:\PROJECTS\Technical Graphics\COLUMN_K_edited.xml') as inputfile: 
      xml = inputfile.read() #XML template file 

     with open('U:\PROJECTS\Technical Graphics\metadata.csv') as csvfile: 

      for row in reader(csvfile, delimiter=';'): #defines CSV delimiter 

        with open('U:\PROJECTS\Technical Graphics\XXX' + str((exampleData[i+3][10])) + ".xml", 'w') as outputfile: 
        #Filename of XMLs based on column 10 data   
         xml = xml.replace('COLUMN_I', str((exampleData[i+3][8]))) 
         xml = xml.replace('COLUMN_K', str((exampleData[i+3][10]))) 


         outputfile.write(xml) #writes 5 XML files 
Verwandte Themen