Чтение CSV-файла и сравнение объектов со списком

1

У меня есть .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
Лучший ответ

Здесь версия для педалей-в-металлическом головоломке:

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 всегда открывайте файлы csv с помощью newline=''

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
  • 0
    Благодарю. Я пытался удалить '\ n' из символов моим кодом, но не смог. Однако ваш код работает нормально :)
0

Чтение в primary_list добавляет \n к каждому номеру - вы должны удалить его:

При добавлении к primary_list do:

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

Обратите внимание на вызов strip. Кроме того, как вы можете видеть, вам действительно не нужно realines, так как for line in primary_data уже делает то, что вам нужно, когда primary_data является файловым объектом.

Теперь, как общий комментарий, поскольку вы используете основной список для поиска, я предлагаю заменить список на набор - это значительно ускорит работу, если список будет большим. Наборы Python очень эффективны для поиска по ключевым словам, списки не предназначены для этой цели.

  • 0
    Я отредактировал свой код, но все равно получил 0. Спасибо за ваши предложения.
  • 0
    @masti: я получаю распечатку «2 3 2» (каждая в отдельной строке) (
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню