Проверка уникальности записей в файл

Как сделать, чтобы в файл записывались только уникальные строки?

import csv
import os.path
FILENAME = 'example.csv'

data = [{'Lot number' : '4738273648100002', 'Pub date' : '25.02.2021'},
        {'Lot number' : '4738273648100004', 'Pub date' : '26.02.2021'}]

def write_csv():
    with open(FILENAME, 'a', newline='') as file:
        names = ['Lot number', 'Pub date']
        writer = csv.DictWriter(file, fieldnames=names, delimiter=';')
        if os.path.getsize(FILENAME) == 0:
            writer.writeheader()
        writer.writerows(data)

write_csv()

проблема в том, что когда в переменную data потом приходят данные, например:

data = [{'Lot number' : '4738273648100001', 'Pub date' : '28.02.2021'},
        {'Lot number' : '4738273648100004', 'Pub date' : '26.02.2021'}]

результат в файле такой:

{'Lot number': '4738273648100002', 'Pub date': '25.02.2021'}
{'Lot number': '4738273648100004', 'Pub date': '26.02.2021'}
{'Lot number': '4738273648100001', 'Pub date': '28.02.2021'}
{'Lot number': '4738273648100004', 'Pub date': '26.02.2021'}

а мне нужно без повторяющихся строк, т.е. такой результат:

{'Lot number': '4738273648100002', 'Pub date': '25.02.2021'}
{'Lot number': '4738273648100004', 'Pub date': '26.02.2021'}
{'Lot number': '4738273648100001', 'Pub date': '28.02.2021'}

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

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

У вас два варианта.

В случае небольшого количества данных - держать их в ОП, при появлении нового элемента - проверять и по необходимости дополнять сам словарь, а в файл писать перед завершением работы всего скрипта.

Каждый раз при появлении новых данных, проверять, присутствуют-ли они в файле уже и дописывать файл, если нет. При большом объеме данных - операция будет не быстрая. Скрипт для ее выполнения выглядит примерно так.

exm={'Lot number': '4738273648100002', 'Pub date': '26.02.2021'}   
with open('data_11.csv', 'r') as file:
itr = csv.DictReader(file)
for row in itr :
    if dict(row)==exm:
        break
else: 
    file.close
    with open('data_11.csv', 'a', newline='') as file:    
        writer = csv.DictWriter(file,fieldnames=exm)
        writer.writerow(exm) 

Результат смотрим в файле

→ Ссылка