【发布时间】:2014-12-03 06:08:04
【问题描述】:
我在 python 的内置 csv 模块中遇到了一种我以前从未注意到的行为。通常,当我在 csv 中阅读时,它几乎一字不差地遵循doc's,使用“with”打开文件,然后使用“for”循环遍历阅读器对象。但是,我最近尝试连续两次遍历 csv.reader 对象,结果发现第二个“for”循环什么也没做。
import csv
with open('smallfriends.csv','rU') as csvfile:
readit = csv.reader(csvfile,delimiter=',')
for line in readit:
print line
for line in readit:
print 'foo'
控制台输出:
Austins-iMac:Desktop austin$ python -i amy.py
['Amy', 'James', 'Nathan', 'Sara', 'Kayley', 'Alexis']
['James', 'Nathan', 'Tristan', 'Miles', 'Amy', 'Dave']
['Nathan', 'Amy', 'James', 'Tristan', 'Will', 'Zoey']
['Kayley', 'Amy', 'Alexis', 'Mikey', 'Sara', 'Baxter']
>>>
>>> readit
<_csv.reader object at 0x1023fa3d0>
>>>
所以第二个'for'循环基本上什么都不做。我的一个想法是 csv.reader 对象在被读取一次后从内存中释放。但情况并非如此,因为它仍然保留它的内存地址。我发现了一个提到类似问题的post。他们给出的原因是,一旦读取了对象,指针就会停留在内存地址的末尾,准备将数据写入对象。这个对吗?有人可以更详细地了解这里发生了什么吗?有没有办法将指针推回到内存地址的开头重新读取它?我知道这样做是不好的编码实践,但我主要只是好奇,想了解更多关于 Python 底层发生的事情。
谢谢!
【问题讨论】:
-
一旦你在第一个循环中使用了迭代器
readit,它基本上是空的。 -
那么可以认为是“只读一次”吗?
-
是的,阅读器对象类似于(如果不是)生成器对象,根据请求从文件中提取和解析行(通过
next())。一旦使用它(运行整个文件),如果您想再次处理它,您需要从头重新启动文件,或者将所有数据读入内存。 -
我在问题中包含的帖子提到了有关
reset()对象的一些内容。你将如何使用它? -
你需要考虑你想要做什么。通常,最好一次性完成任何必要的处理。如果您要足够频繁地重复使用数据,请继续将其读入内存(例如作为列表)。
标签: python pointers object csv memory