Для примера, скажем, у меня есть файл CSV, который выглядит следующим образом:
foods.csv
beef,stew,apple,sauce
apple,pie,potato,salami
tomato,cherry,pie,bacon
И следующий код, который предназначен для имитации структуры вашего текущего кода:
def main():
import csv
keywords = ["apple", "pie"]
with open("foods.csv", "r") as file:
reader = csv.reader(file)
for keyword in keywords:
for row in reader:
if keyword in row:
print(f"{keyword} was in {row}")
print("Done")
main()
Желаемый результат заключается в том, что для каждого ключевого слова в моем списке ключевых слов, если это ключевое слово существует в одной из строк в моем файле CSV, я выведет на экран строку с указанием, в какой строке произошло ключевое слово.
Тем не менее, вот фактический результат:
apple was in ['beef', 'stew', 'apple', 'sauce']
apple was in ['apple', 'pie', 'potato', 'salami']
Done
>>>
Ему удалось найти оба экземпляра ключевого слова. apple
в файле, но он не нашел pie
! Итак, что дает?
Проблема
Дескриптор file
(в вашем случае csvfile
) возвращает свое содержимое один раз, а затем оно расходуется. Наш объект reader
оборачивает дескриптор файла и потребляет его содержимое до тех пор, пока они не будут исчерпаны, после чего не останется строк для чтения из файла (внутренний указатель файла продвинулся до конца), а внутренний для -l oop не будет выполнен второй раз.
Решение
Либо переместите указатель внутреннего файла в начало, используя seek
после каждой итерации external for-l oop, или прочитать содержимое файла один раз в список или подобную коллекцию, а затем выполнить итерацию по списку:
Обновленный код:
def main():
import csv
keywords = ["apple", "pie"]
with open("foods.csv", "r") as file:
contents = list(csv.reader(file))
for keyword in keywords:
for row in contents:
if keyword in row:
print(f"{keyword} was in {row}")
print("Done")
main()
Новый вывод:
apple was in ['beef', 'stew', 'apple', 'sauce']
apple was in ['apple', 'pie', 'potato', 'salami']
pie was in ['apple', 'pie', 'potato', 'salami']
pie was in ['tomato', 'cherry', 'pie', 'bacon']
Done
>>>