2013-07-07 15 views
5

Ich habe eine CSV-Datei, aber ich möchte die erste Reihe von Daten überspringen und mit dem nächsten fortfahren. Hier ist mein Code:CsvReader Nächste Funktion

def read_csv(inputfile): 
    return list(csv.reader(inputfile)) #<----- 

def generate_xml(reader,outfile): 
    root = Element('Solution') 
    root.set('version','1.0') 
    tree = ElementTree(root)   
    head = SubElement(root, 'DrillHoles') 
    description = SubElement(head,'description') 
    current_group = None 
    i = 1 
    for row in reader.next(): #<----- 
     x1,y1,z1,x2,y2,z2,cost = row 
     if current_group is None or i != current_group.text: 
      current_group = SubElement(description, 'hole',{'hole_id':"%s"%i}) 

      collar = SubElement(current_group,'collar') 
      toe = SubElement(current_group,'toe') 
      cost1 = SubElement(current_group,'cost') 
      collar.text = ','.join((x1,y1,z1)) 
      toe.text = ','.join((x2,y2,z2)) 
      cost1.text = cost 
     i+=1 
    head.set('total_holes', '%s'%i) 
    indent.indent(root) 
    tree.write(outfile) 

Wie Sie sehen können, ich die CSV-Datei als eine Liste zurückgeben dann gehe ich es auf die generate_xml Funktion. Allerdings, wenn ich das komplette Programm dort laufen ist ein

error: 'list' object has no attribute 'next' 

Antwort

20

Sie haben eine Liste, kein Iterator. stattdessen in Scheiben schneiden Sie es einfach:

for row in reader[1:]: 

oder überspringen, dass die erste Reihe, wenn Sie noch ein tatsächliches csv.reader() Objekt haben:

def read_csv(inputfile): 
    reader = csv.reader(inputfile) 
    next(reader) 
    return list(reader) 

Sie wäre besser dran Rückgabe das reader Objekts statt Lesen Sie alle Zeilen in dem Speicher Dort; es sei denn, Sie benötigen unbedingt einen wahlfreien Zugriff auf die Zeilen.

Sie sollten auch wirklich die next() function stattdessen verwenden, wie es für Python 2.6 + und 3 funktioniert, wo der Iterator .next() Methode in .__next__() umbenannt wurde.

, würden Sie sonst nie Verwendung for row in reader.next(), weil .next() auf einem csv.reader() Iterator eine Zeile zurückgibt.

5

für Python 2.x, ist der Code:

data = [] 
with open('xxx.csv') as f: 
    r = csv.reader(f) 
    name = r.next()[1] # assume the first 2 rows are name and unit 
    unit = r.next() 
    for row in r: 
     data.append(row) 

für Python 3.x verwenden next(r) statt r.next()

Verwandte Themen