Циклы For не будут гнездиться

#python

#python

Вопрос:

Я пишу скрипт для сравнения двух файлов csv. План состоит в том, чтобы скрипт находил элементы с одинаковым идентификатором и отправлял их в третий csv.

Для этого я использую вложенный цикл for . Он должен выбрать строку в первом файле, а затем сравнить ее с каждой строкой (по одной за раз) во втором. Пока все хорошо.

Скрипт должен повторять это для каждой строки в первом файле. Однако после некоторой отладки я обнаружил, что скрипт сравнивает только первую строку с каждой строкой во второй перед остановкой. Другие строки никогда не сравниваются.

Я не понимаю, почему, хоть убей. Я уже съеживаюсь на случай, если это окажется ошибкой школьника, но подумал, что стоит спросить сообщество.

Есть идеи?

 
outdata = []
newPrices = open(csv1)
oldPrices = open (csv2)
priceComparison = open (csv3)

new=csv.reader(newPrices, delimiter=',')
old=csv.reader(oldPrices, delimiter=',')
writer=csv.writer(priceComparison,delimiter=',')
for row1 in new:
    print(row1[0])
    for row2 in old:
        print(row1[0]) #Seems to be sticking on the first value and not looping the first for loop
        if row1[0].upper == row2[0]:
            print("row: ", row)
            outdata.append([row1])
            outdata.append([row2])
        
print(outdata)
writer.writerows(outdata)
 

Комментарии:

1. Вам было бы лучше использовать фреймы данных pandas: меньше кода и быстрее.

Ответ №1:

Я не уверен на 100%, но я предполагаю, что csv.reader возвращает итератор, который может быть использован только один раз. Следовательно, почему вы выполняете цикл только old один раз. Попробуйте поместить строки в списки перед их обходом, например:

 new = list(csv.reader(newPrices, delimiter=","))
old = list(csv.reader(oldPrices, delimiter=","))
 

Вот ссылка на документацию на случай, если это полезно: https://docs.python.org/3/library/csv.html#csv.reader

Комментарии:

1. На месте. Спасибо за быстрый ответ. Оказывается, что объекта writer также недостаточно. В конце мне пришлось использовать csv.DictWriter