【问题标题】:Python csv reader can't seek to linePython csv阅读器无法寻求行
【发布时间】:2014-06-18 00:04:37
【问题描述】:

我有一个简单的测试 CSV 文件:

1,2,3
4,5,6
7,8,9
10,11,12

我正在尝试阅读前两行,返回一行,然后重新阅读下一行:

import csv
with open('test.csv', 'r') as f:
    reader = csv.reader(f)
    pos = f.tell()
    print 'pos: {0}'.format(pos)
    print reader.next()

    pos = f.tell()
    print 'pos: {0}'.format(pos)
    print reader.next()

    f.seek(pos)
    pos = f.tell()
    print 'pos: {0}'.format(pos)

    print reader.next()
    pos = f.tell()
    print 'pos: {0}'.format(pos)

但是,文件在第一次调用next() 时被完全读取:

pos: 0
['1', '2', '3']
pos: 27
['4', '5', '6']
pos: 27
Traceback (most recent call last):
  File "<stdin>", line 15, in <module>
StopIteration

我尝试设置buffering=0,但出现了同样的问题。如果我明确使用文件对象来执行readline(),一切正常。有什么方法可以防止 csv 阅读器在第一次 next() 调用时读取多行?

【问题讨论】:

    标签: python csv io


    【解决方案1】:

    我认为这是不可能的。 file.next 的文档解释了原因:

    为了使 for 循环成为最有效的循环方式 文件的行(一个非常常见的操作), next() 方法使用 隐藏的预读缓冲区。由于使用预读 缓冲区,将 next() 与其他文件方法(如 readline())结合 无法正常工作。 但是,使用 seek() 将文件重新定位到 绝对位置将刷新预读缓冲区。

    事实上,如果您使用 io 模块打开文件(这是 Python 3.x 中的默认设置),则会引发特定的 IOError 告诉您它不允许:

      File "./c.py", line 12, in <module>
        pos = f.tell()
    IOError: telling position disabled by next() call
    

    【讨论】:

      猜你喜欢
      • 2018-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-09
      • 2016-12-15
      • 1970-01-01
      • 2012-02-28
      • 1970-01-01
      相关资源
      最近更新 更多