Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 读取csv文件并将对象与列表进行比较_Python - Fatal编程技术网

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

Python 读取csv文件并将对象与列表进行比较,python,Python,我有一个.txt文件,主列表,字符串如下: f r y h g j d,g,r,e,w,s j,f,o,b,x,q,h y,n,b,w,q,j 我有一个.csv文件,配方列表,行如下: f r y h g j 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_fun

我有一个.txt文件,主列表,字符串如下:

f
r
y
h
g
j
d,g,r,e,w,s
j,f,o,b,x,q,h
y,n,b,w,q,j
我有一个.csv文件,配方列表,行如下:

f
r
y
h
g
j
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)

读取
primary\u列表
会将
\n
添加到每个数字中-您应该将其删除:

添加到
主列表时
执行以下操作:

for line in primary_data:
    primary_list.append(line.strip())
注意
strip
调用。另外,正如您所看到的,您实际上不需要
实线
,因为
对于主\u数据中的行
已经完成了当
主\u数据
是文件对象时所需的工作


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

下面的代码可以解决这个问题

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

以下是金属版的裸版essentials踏板:

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

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

打开csv文件。我编辑了代码,但仍然得到了0。谢谢你的建议。@masti:我会打印出“2 3 2”(每一行都有自己的内容)。@masti:如果你有兴趣找出为什么仍然得到0,请插入
print(primary_list)
并检查它的内容。谢谢。我试图用我的代码从字符中删除“\n”,但我做不到。但是你的代码工作正常:)