2013-07-07 12 views
5

Otrzymałem plik csv, ale chcę pominąć pierwszy wiersz danych i przejść do następnego. Tu jest mój kodu:CsvReader Następna funkcja

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) 

Jak widać, wracam pliku csv jako lista następnie przekazać go do funkcji generate_xml. Jednak kiedy uruchomić kompletny program istnieje

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

Odpowiedz

20

Masz listy, a nie iteracyjnej. Wystarczy pokroić go zamiast:

for row in reader[1:]: 

lub pominąć ten pierwszy rząd, kiedy jeszcze rzeczywistej csv.reader() obiektu:

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

Byłbyś lepiej powrocie obiekt reader zamiast czytać wszystkie wiersze do pamięci tam; chyba że absolutnie potrzebujesz losowego dostępu do wierszy.

też powinny naprawdę użyć next() function zamiast, jak to działa na Python 2.6+ i 3, gdzie metoda iterator .next() została zmieniona na .__next__().

że inaczej nigdy użycie for row in reader.next(), ponieważ .next() na csv.reader() iterator zwraca jeden wiersz Ty.

5

dla Pythona 2.x, kod jest:

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) 

dla Pythona 3.x, należy next(r) zamiast r.next()

Powiązane problemy