<p>我将试着回答你关于读者在做什么以及为什么<code>reset()</code>或<code>seek(0)</code>可能有帮助的其他问题。在最基本的形式中,csv阅读器可能如下所示:</p>
<pre><code>def csv_reader(it):
for line in it:
yield line.strip().split(',')
</code></pre>
<p>也就是说,它接受生成字符串的任何迭代器并为您提供一个生成器。它所做的只是从迭代器中获取一个项,对其进行处理并返回该项。当消费<code>it</code>时,csv_读取器将退出。读者不知道迭代器是从哪里来的,也不知道如何正确地创建一个新的迭代器,所以它甚至不尝试重置自己。那是留给程序员的。</p>
<p>我们可以在读者不知道的情况下修改迭代器,也可以创建一个新的读者。这里有一些例子来证明我的观点。</p>
<pre><code>data = open('data.csv', 'r')
reader = csv.reader(data)
print(next(reader)) # Parse the first line
[next(data) for _ in range(5)] # Skip the next 5 lines on the underlying iterator
print(next(reader)) # This will be the 7'th line in data
print(reader.line_num) # reader thinks this is the 2nd line
data.seek(0) # Go back to the beginning of the file
print(next(reader)) # gives first line again
data = ['1,2,3', '4,5,6', '7,8,9']
reader = csv.reader(data) # works fine on lists of strings too
print(next(reader)) # ['1', '2', '3']
</code></pre>
<p>一般来说,如果您需要第二次访问,最好关闭/重新打开您的文件并使用新的csv阅读器。它的清洁和确保良好的簿记。</p>