<p><code>csvreader</code>文档说:</p>
<blockquote>
<p>... csvfile can be any object which supports the iterator protocol and returns a string each time its next() method is called ...</p>
</blockquote>
<p>因此,对OP的原始代码稍作修改:</p>
<pre><code>import csv
import os
filename = "tar.data"
with open(filename, 'rb') as csvfile:
spamreader = csv.reader(csvfile)
justtesting = csvfile.tell()
size = os.fstat(csvfile.fileno()).st_size
for row in spamreader:
pos = csvfile.tell()
print pos, "of", size, "|", justtesting
###############################################
def generator(csvfile):
# readline seems to be the key
while True:
line = csvfile.readline()
if not line:
break
yield line
###############################################
print
with open(filename, 'rb', 0) as csvfile:
spamreader = csv.reader(generator(csvfile))
justtesting = csvfile.tell()
size = os.fstat(csvfile.fileno()).st_size
for row in spamreader:
pos = csvfile.tell()
print pos, "of", size, "-", justtesting
</code></pre>
<p>在我的测试数据上运行这个程序可以得到以下结果,表明这两种不同的方法会产生不同的结果。在</p>
^{pr2}$
<p>我在<code>open</code>上设置了零缓冲,但这没什么区别,问题是{<cd3>}在生成器中。在</p>