Почему не работает вложенный цикл

Есть задача. Мы читаем cvs файл. Потом пользователь вводит название стран, а наш код должен найти информацию по этим странам. Вот код, только я не понимаю, почему for row проходит один раз, а print i столько раз сколько елементов в массиве.

import csv

with open('Data.csv', newline='') as File:

    reader = csv.reader(File)

    for row in reader:

        print(row)

x = []
g = 0
while g != "end":
    g = input("Country?\n")
    x.append(g)

with open('Data.csv', newline='') as File:

    reader = csv.reader(File)
    myData = []
    for i in x:
        print(i)
        for row in reader:
            if i == row[0]:
                myData.append(row)
                #print("Writing complete")
                print("Out:", row)


myFile = open('example2.csv', 'w')
with myFile:
        writer = csv.writer(myFile)
        writer.writerow(myData)

Ответы (3 шт):

Автор решения: passant

Если вы про вот этот фрагмент:

for i in x:
        print(i)
        for row in reader:
            if i == row[0]:
                myData.append(row)
                #print("Writing complete")
                print("Out:", row)

то print(i) сработает столько раз, сколько названий стран пользователь ввел. А вот print("Out:", row) сработает только тогда, когда i == row[0]. И тут возникает вопрос. reader - это итеритуемый объект. На каждой итерации берется одно его значение и помещается в объект row. Объект этот - строка. А вот row[0] - это первая буква этой строки. И получается, что вы i сравниваете с одной литерой. Скорее всего они никогда не совпадут.

→ Ссылка
Автор решения: Dima
import csv

with open('Data.csv', newline='') as File:
    reader = csv.reader(File)

    for row in reader:
        print(row)

x = []
g = 0
while g != "end":
    g = input("Country?\n")
    x.append(g)


myData = []
for i in x:
    print(i)
    with open('Data.csv', newline='') as File:
        reader = csv.reader(File)
        for row in reader:
            if i == row[0]:
                myData.append(row)
                print("Out:", row)

myFile = open('example2.csv', 'w')
with myFile:
    writer = csv.writer(myFile)
    writer.writerow(myData)
→ Ссылка
Автор решения: Xander

Я не работал с библиотекой csv, и могу ошибаться, но у меня есть подозрение, что метод reader проходится по файлу один раз, и после того, как он достиг конца файла, он уже не будет читать его ещё раз сначала.

Возможно, имеет смысл создавать копию содержимого файла, и дальше итерироваться уже по ней.

То есть вот эту строку:

reader = csv.reader(File)

замените на такую:

reader = list(csv.reader(File))

Этот способ должен хорошо работать, для случая когда размер файла относительно небольшой (например, не больше десятков мегабайт, или сколько там вы можете позволить себе хранить в оперативной памяти).

Для очень больших файлов, возможно, лучше будет каждый раз открывать файл заново уже внутри цикла. То есть вот эту часть:

with open('Data.csv', newline='') as File:

    reader = csv.reader(File)

поместить уже после строки

for i in x:
→ Ссылка