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