Проверка содержимого одного файла на наличие данных из другого

Пытаюсь сравнить 2 фала: 1 Файл введите сюда описание изображения 2 Файл введите сюда описание изображения

Нужно взять из первого файла значение IP_PROP56 и проверить его на наличие в поле второго файла, если такого значения нет, то сохранить.

Вопрос: не происходит перебор всех значений, на 120 строке встречается совпадение из первого файла, выводиться, и на этом всё. В первом файле 1900 строк, во втором 1600 и эти 1600 точно есть в 1 файле введите сюда описание изображения

with open('cat.csv', 'r') as f, open('products.csv', 'r') as f2:
    reader = csv.DictReader(f, delimiter=';')
    reader2 = csv.DictReader(f2, delimiter=';')
    i = 1
    i2 = 1
    for d in reader:
        #print(str(type(d)) + str(i))
        prop = d['IP_PROP56'].strip().strip('/n')
        for d2 in reader2:
            prop2 = d2['IP_PROP56'].strip().strip('/n')
            #pprint.pprint(d2['IP_PROP56'])
            if prop == prop2:
                print(str(i) + ':   ' + prop + ' - ' + str(i2) + ': ' + prop2 )
            i2 += 1
        #pprint.pprint(d)
        i += 1

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

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

Ну естественно, любой метод последовательного чтения файла не перематывается автоматически на начало. Итератор проходит один раз по файлу и всё. Нужно для внутреннего цикла всё заново открывать каждый раз:

with open('cat.csv', 'r') as f:
    reader = csv.DictReader(f, delimiter=';')
    ...
    for d in reader:
        ...
        with open('products.csv', 'r') as f2:
            reader2 = csv.DictReader(f2, delimiter=';')
            for d2 in reader2:
                ...

Но ещё более правильно было бы использовать, например, Pandas и делать через него join двух таблиц, примерно как в SQL.

→ Ссылка
Автор решения: Vitalizzare ушел в монастырь

csv.DictReader - это итератор. Особенность итератора в том, что он перебирает содержимое только в одну сторону. Достигнув конца, он становится "пустым" в том смысле, что при повторном обращении к нему в цикле for тело цикла ни разу не выполнится - итератор сразу вернет исключение StopIteration. В вашем случае вложенный цикл for d2 in reader2 исчерпает содержимое reader2 при первом заходе. То есть, вы найдете все совпадения во втором файле для первой записи первого файла. Все остальные записи будут работать с пустым итератором, то есть, никаких сравнений сделано не будет.

Решением будет чтение как минимум второго файла в список, который является итерируемым объектом. При повторном обращении к итерируемому объекту типа list в цикле for будет создан новый итератор, который начнет перебор содержимого списка сначала.

with open('cat.csv', 'r') as f1, open('products.csv', 'r') as f2:
    data1 = list(csv.DictReader(f1, delimiter=';'))
    data2 = list(csv.DictReader(f2, delimiter=';'))

for i1, d1 in enumerate(data1):
    prop1 = d1['IP_PROP56'].strip()
    for i2, d2 in enumerate(data2):
        prop2 = d2['IP_PROP56'].strip()
        if prop1 == prop2:
            print(str(i1) + ':   ' + prop1 + ' - ' + str(i2) + ': ' + prop2 )
→ Ссылка
Автор решения: Stanislav Volodarskiy

В чём ошибка вам уже объяснили, я повторять не буду. Но зачем вы сравниваете записи каждую с каждой? Это медленно. Лучше прочитать записи в словари и сравнить данные в словарях:

def read_to_dict(fname):
    d = {}
    with open(fname, 'rb') as f:
        reader = csv.DictReader(f, delimiter=';')
        for i, d in enumerate(reader, start=1):
            prop = d['IP_PROP56'].strip()
            d.setdefault(prop, []).append(i)
    return d


d1 = read_to_dict('cat.csv')
d2 = read_to_dict('products.csv')

for key in d1.keys() & d2.keys():
    print(d1[key], d2[key], key)
→ Ссылка