2013-07-07 28 views
5

tôi được cung cấp một tệp csv nhưng tôi muốn bỏ qua hàng dữ liệu đầu tiên và chuyển sang bước tiếp theo. Đây là mã của tôi:CsvReader Chức năng tiếp theo

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) 

Như bạn có thể thấy, tôi trả lại tệp csv dưới dạng danh sách sau đó tôi chuyển nó vào hàm generate_xml. Tuy nhiên khi tôi chạy chương trình hoàn chỉnh có một

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

Trả lời

20

Bạn có một danh sách , không phải là một iterator. Chỉ cần cắt nó thay vì:

for row in reader[1:]: 

hoặc bỏ qua đó hàng đầu tiên khi bạn vẫn còn có một đối tượng thực tế csv.reader():

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

Bạn muốn được tốt hơn trả lại đối tượng reader thay vì đọc tất cả các hàng vào bộ nhớ ở đó; trừ khi bạn hoàn toàn cần truy cập ngẫu nhiên vào các hàng.

Bạn cũng nên thực sự sử dụng next() function thay vì nó hoạt động với Python 2.6+ và 3, trong đó phương thức iterator .next() đã được đổi tên thành .__next__().

bạn muốn khác không bao giờ sử dụngfor row in reader.next(), vì .next() trên một iterator csv.reader() trả một hàng.

5

Đối với python 2.x, mã này là:

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) 

Đối với python 3.x, sử dụng next(r) thay vì r.next()

Các vấn đề liên quan