【问题标题】:Python CSV reader doesn't skip first linePython CSV 阅读器不会跳过第一行
【发布时间】:2017-05-01 13:36:36
【问题描述】:

我正在尝试读取一个并写入第二个 CSV 文件。问题是我需要在读取输入 CSV 文件之前知道它有多少行。

with open('csv/file.csv') as f:
    with open('output/output_{}.csv'.format(time.strftime("%Y%m%d-%H%M%S")), 'wb') as o:
        reader = csv.DictReader(f)
        reader.fieldnames.append('VAT added')
        rows = sum(1 for _ in reader)
        f.seek(0)
        writer = csv.DictWriter(o, fieldnames=reader.fieldnames)
        writer.writeheader()
        for n,line in enumerate(reader):
            print line
            print '{} lines remaining'.format(rows-n)
            code = line['number'].strip()
            ...
            writer.writerow(line)

问题在于它读取了headerline,所以它在第一次迭代后返回错误。问题出在哪里?

【问题讨论】:

  • 你能准确地发布你得到的错误吗?你可以跳过第一次迭代。
  • 如果你做了for n, line in enumerate(reader): if n > 0: <blah>呢?
  • pandas 的 read_csv 函数有一个 skiprowsheader 参数,它们中的任何一个都应该能够在这里为您提供帮助。 pandas.pydata.org/pandas-docs/stable/generated/…
  • 我不确定我是否理解您的错误描述。标题和问题主体之间似乎有所不同。您遇到的一个非常明显的问题是,当您计算其长度时,您正在耗尽reader 生成器(不是file.seek 不会帮助您)。一旦你这样做了,你就不能再次迭代它。要解决此问题,请将其转换为列表。然后你可以在它上面调用len 并迭代它直到你的心满意足。那是假设它不是一个非常大的文件。在这种情况下,创建列表可能不是一个好主意。
  • 当我运行它时,它运行完成。我认为如果你能告诉我们什么错误,由哪一行发出,换句话说,重现堆栈跟踪,这将有所帮助。问题可能出在您的数据中:例如,如果您的 csv 没有标题为“数字”的列,您将收到一个关键错误。

标签: python python-2.7 csv


【解决方案1】:

问题 ...它在第一次迭代后返回错误

不知道你得到了哪个错误,但我明白了 TypeError: 'str' 不支持缓冲区接口

原因是这行代码:

with open('output/output_{}.csv'.format(time.strftime("%Y%m%d-%H%M%S")), 'wb') as o:

不要以二进制模式打开csv文件wb,改为w,例如

with open('output/output_{}.csv'.format(time.strftime("%Y%m%d-%H%M%S")), 'w') as o:

用 Python:3.4.2 测试

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-08
    相关资源
    最近更新 更多