【问题标题】:Can only iterate once through csv reader只能通过 csv 阅读器迭代一次
【发布时间】:2014-12-08 03:27:11
【问题描述】:

所以我基本上有一个非常长的字符串列表,以及一个包含一列字符串和一列数字的 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)

我可能会使用它的 CSV 文件示例

a, 1
great, 2

当然 csv.reader(f) 创建了一个我只能循环一次的可迭代对象。我在其他地方看到了使用 itertools 的建议,但我发现的所有建议都是针对涉及少量循环 CSV 文件的问题,通常只有两次。如果我多次尝试使用它来循环遍历 CSV,我不确定这对内存消耗意味着什么,总的来说,我只是想知道解决这个问题的最聪明的方法。

【问题讨论】:

  • 文件有多大?您可以将整个内容读入字典并针对生成的字典执行查找吗?

标签: python csv iteration


【解决方案1】:

您需要“重置”文件迭代器:

import csv
sList = ['a cat', 'great wall', 'mediocre wall']
vals = []
with open('data.csv', 'r') as f:
    r = csv.reader(f)
    for w in sList:
        val = 0
        f.seek(0)  #<-- set the iterator to beginning of the input file
        for row in r:
            print(row)
            if row[0] in w:
                val += 1
        vals.append(val)

【讨论】:

  • 有趣,我会试试这个——但你确定我设置的是 f.seek(0) 而不是 r.seek(0)?正在检查,谢谢您的帮助!
  • @Addem。我确定,我在发布到 python 3.4 之前对此进行了测试。
猜你喜欢
  • 1970-01-01
  • 2017-07-05
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-09
  • 2015-03-29
相关资源
最近更新 更多