CsvReader 下一个函数

新手上路,请多包涵

我得到了一个 csv 文件,但我想跳过第一行数据并转到下一行。这是我的代码:

 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)

如您所见,我将 csv 文件作为列表返回,然后将其传递给 generate_xml 函数。然而,当我运行完整的程序时,有一个

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

原文由 Andy 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 349
2 个回答

你有一个 list ,而不是迭代器。只需将其切片即可:

 for row in reader[1:]:

或者当你还有一个实际的 csv.reader() 对象时跳过第一行:

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

您最好返回 reader 对象,而不是将所有行读入内存;除非你绝对需要随机访问行。

您还应该真正使用 next() 函数,因为它适用于 Python 2.6+ 和 3,其中迭代器 .next() 方法已重命名为 .__next__()

否则你 永远不会 使用 for row in reader.next() ,因为 .next()csv.reader() 迭代器返回 _一行_。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 3.0 许可协议

对于 python 2.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)

对于 python 3.x,使用 next(r) 而不是 r.next()

原文由 Yuchao Jiang 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏