2013-07-07 9 views
5

私はcsvファイルを与えられましたが、データの最初の行をスキップして、次の行に移動します。あなたが見ることができるように、私は、私はgenerate_xml機能にそれを渡すリストとしてcsvファイルを返すCsvReader次の機能

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) 

:ここに私のコードです。私は完全なプログラムを実行するとしかし、あなたはリスト、ないイテレータを持って

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

答えて

20

があります。

​​

をしたり、まだ実際のcsv.reader()オブジェクトがある場合、その最初の行をスキップ:だけではなく、それをスライス

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

あなたはreaderオブジェクトを返す代わりに、メモリにすべての行を読んだほうが良いと思いますがそこ;行へのランダムアクセスが絶対に必要な場合を除きます。

また、イテレータ.next()メソッドの名前が.__next__()に変更されているPython 2.6+および3の場合は、実際にはnext() functionを使用する必要があります。

あなたcsv.reader()イテレータの.next()が列を返すので、それ以外の場合は決して使用for row in reader.next()と思います。 Pythonの2.xの

5

、コードは:Pythonの3.xの

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) 

、代わりr.next()

next(r)を使用します