Python csv阅读器不能寻求排队

时间:2014-06-18 00:04:37

标签: python csv io

我有一个简单的测试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()呼叫时多行阅读?

1 个答案:

答案 0 :(得分:4)

我不认为这是可能的。 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