只能一次遍历csv读取器

8

我有一个非常长的字符串列表和一个包含字符串列和数字列的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,则不确定这对内存消耗意味着什么,总体上,我想知道解决此问题的最明智方法是什么。

这个文件有多大?你能将整个文件读入字典,然后对生成的字典进行查询吗? - Larry Lustig
1个回答

9
您需要“重置”文件迭代器:
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
1
@Addem。我确定,在发布到Python 3.4之前,我已经测试过了。 - Marcin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接