读取csv文件并将对象与列表进行比较

时间:2011-05-09 07:00:22

标签: python

我有一个.txt文件,主列表,包含这样的字符串:

f
r
y
h
g
j

我有一个.csv文件,食谱列表,有这样的行:

d,g,r,e,w,s
j,f,o,b,x,q,h
y,n,b,w,q,j

我的程序会抛出每一行并计算属于主列表的对象数量,例如在这种情况下,结果是: 2 3 2 我总是得0,错误一定是愚蠢的,但我无法弄明白:

from __future__ import print_function
import csv

primary_data =  open('test_list.txt','r') 
primary_list = [] 
for line in primary_data.readlines():
    line.strip('\n')
    primary_list.append(line)

recipes_reader = csv.reader(open('test.csv','r'), delimiter =',')

for row in recipes_reader:
    primary_count = 0
    for i in row:
        if i in primary_list:
            primary_count += 1
    print (primary_count)

3 个答案:

答案 0 :(得分:0)

阅读primary_list会为每个号码添加\n - 您应将其删除:

追加到primary_list时:

for line in primary_data:
    primary_list.append(line.strip())

请注意strip来电。另外,正如您所看到的,您实际上并不需要realines,因为当for line in primary_data是文件对象时,primary_data已经满足了您的需求。

现在,作为一般性评论,由于您使用主列表进行查找,我建议用一个集替换列表 - 如果列表很大,这将使事情变得更快。 Python集对于基于密钥的查找非常有效,列表不是为此目的而设计的。

答案 1 :(得分:0)

以下代码可以解决问题。

from __future__ import print_function
import csv
primary_data =  open('test_list.txt','r')

primary_list = [line.rstrip() for line in primary_data]

recipies_reader = csv.reader(open('recipies.csv','r'), delimiter =',')
for row in recipies_reader:
    count = 0
    for i in row:
       if i in primary_list:
           count += 1

    print (count)

<强>输出

2
3
2

答案 2 :(得分:0)

这是踩踏金属版的基本要素:

from __future__ import print_function
import csv

with open('test_list.txt', 'r') as f: # with statement ensures your file is closed
    primary_set = set(line.strip() for line in f)

with open('test.csv', 'rb') as f: #### see note below ###
    for row in csv.reader(f): # delimiter=',' is the default
        print(sum(i in primary_set for i in row)) # i in primary_set has int value 0 or 1

注意:在Python 2.x中,始终以二进制模式打开csv文件。在Python3.x中,始终使用newline=''

打开csv文件