Почему не работает вложенный цикл
Есть задача. Мы читаем 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 шт):
Если вы про вот этот фрагмент:
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 сравниваете с одной литерой. Скорее всего они никогда не совпадут.
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)
Я не работал с библиотекой 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: