2014-06-18 39 views
0

我有一個簡單的測試CSV文件:Python的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 

我TRIE d設置爲buffering=0,但出現同樣的問題。如果我明確使用文件對象來執行readline(),那麼一切正常。有什麼辦法可以防止csv閱讀器在第一個next()調用中多行讀取?

回答

4

我不認爲這是可能的。爲file.next文檔解釋了原因:

爲了使循環在 行的文件中(一個非常常見的操作),下()方法的for循環的最有效的方式使用 隱藏預讀緩衝區。由於使用預讀 緩衝區,將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