我可以在Python中重置迭代器/生成器吗?我正在使用DictReader并希望将其重置(从csv模块)到文件的开头.
老实说,我在这里有点困惑,为什么我不能在相同的数据上迭代两次?
def _view(self,dbName):
db = self.dictDatabases[dbName]
data = db[3]
for row in data:
print("doing this one time")
for row in data:
print("doing this two times")
Run Code Online (Sandbox Code Playgroud)
这将打印出"一次这样做"几次(因为数据有几行),但它根本不会打印出"这样做两次"......
我第一次迭代数据工作正常,但第二次当我运行最后一个列表"for data in data"时,这没有返回...所以执行它一次工作但不是两次......?
仅供参考 - 数据是一个csv.reader对象(如果是这样的原因)......
所以我基本上有一个非常长的字符串列表,以及一个包含一列字符串和一列数字的CSV文件.我需要遍历极长的字符串列表,并为每个字符串循环遍历CSV文件的行,检查CSV的第一列中的每个字符串以查看它是否出现在我的字符串中,如果是,则添加在另一列中的数字.最小的例子就是
import csv
sList = ['a cat', 'great wall', 'mediocre wall']
vals = []
with open('file.csv', 'r') as f:
r = csv.reader(f)
for w in sList:
val = 0
for row in r:
if row[0] in w:
val += 1
vals.append(val)
Run Code Online (Sandbox Code Playgroud)
我可以使用它的CSV文件的示例可以是
a, 1
great, 2
Run Code Online (Sandbox Code Playgroud)
当然csv.reader(f)创建一个我只能循环一次的迭代.我已经在其他地方看到了使用itertools的建议,但我发现的所有建议都是针对涉及循环CSV文件少量的问题,通常只是两次.如果我尝试使用它循环CSV多次,我不确定这对于内存消耗意味着什么,而且一般来说我只是想知道解决这个问题的最聪明的方法.
我在python的内置csv模块中遇到过一个我以前从未注意过的行为.通常,当我在csv中读取时,它几乎逐字地遵循文档,使用"with"打开文件,然后使用"for"循环遍历reader对象.但是,我最近尝试连续两次迭代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'
Run Code Online (Sandbox Code Playgroud)
控制台输出:
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>
>>>
Run Code Online (Sandbox Code Playgroud)
所以第二个'for'循环基本上什么也没做.我有一个想法是csv.reader对象在被读取一次后从内存中释放.但事实并非如此,因为它仍然保留了它的内存地址.我找到了一篇提到类似问题的帖子.他们给出的原因是,一旦读取了对象,指针就会停留在内存地址的末尾,准备将数据写入对象.它是否正确?有人可以详细了解这里发生了什么吗?有没有办法将指针推回到内存地址的开头重新读取?我知道这样做是不好的编码实践,但我主要只是好奇并希望更多地了解Python的内容.
谢谢!
我正在尝试使用21列和大量行对数据集进行分类.我已经达到了可以将数据作为csv导入并打印出单独列的程度.我还有两件事要做.首先,我希望能够打印出特定的数据点.例如,位于第2行第4列的数据点.第二个任务是根据第4列和第5列对数据行进行分类.这些列是纬度和经度.而我正在尝试获取世界特定部分的行.所以我的想法就是这样
if 60 > row[4] > 45 and 165 > row[1] > 150:
Run Code Online (Sandbox Code Playgroud)
即(如数学运算(9> x> 5))
我不确定上述程序的正确方法是什么.
我已将代码粘贴到底部.我是python编程的新手,所以随时指出错误.
import csv
path = r'C:\Documents and Settings\eag29278\My Documents\python test code\test_satdata.csv'
with open(path, 'rb') as f:
reader = csv.reader(f, delimiter=',')
for row in reader:
print row [0]
#this prints out the first column
var1 = []
for row in f:
if 60 > row[4] > 45 and 165 > row[1] > 150:
var1.append(row)
print var1
Run Code Online (Sandbox Code Playgroud)
更新1
好吧所以我更新了代码,但是当我运行模块时,我得到了这个输出..
2010 2010 2010 2010 2010 2010 …