Ваши вопросы
Я могу выделить два вопроса: - Проблема оптимизации, - Технический вопрос о сравнении наборов данных.
Об оптимизации
Лучше всегоесть рабочая программа, чем оптимизированная, которая не работает идеально.Таким образом, вы можете сосредоточиться на разработке чего-то функционального, а затем оптимизировать его.
В любом случае, если вы хотите найти дубликаты в двух наборах данных, вам понадобится по крайней мере один набор данных в памяти, если ваши наборы данных не имеют некоторыхвнутренние свойства, которые позволяют дальнейшую оптимизацию (например, я думаю о порядке).
О поиске дубликатов
Например, меньший набор данных может быть загружен в повторяемый (например, list
), а второй можно итерировать из файла / базы данных, используя функцию генератора.
Вот демонстрационная версия:
# data1 in memory
data1 = ['a', 'b', 'd', 'c']
# data2 produced by a generator
def item_data2():
for item in ['a', 'd', 'e', 'c']:
yield item
duplicates = [x for x in item_data2() if x in data1]
# -> ['a', 'd', 'c']
Некоторые рекомендации
Чтение файла CSV
Чтобы прочитать файлы CSV, вы можете использовать библиотеку csv .В вашем конкретном случае вы можете использовать DictReader .
import csv
import io
import os
import pprint
delimiter = '|'
header = "id|name|address".split(delimiter)
data_dir = "path/to/data/directory"
csv_path = os.path.join(data_dir, "source1.csv")
with io.open(csv_path, mode="r", encoding="utf-8") as f:
reader = csv.DictReader(f, header, delimiter=delimiter)
for entry in reader:
pprint.pprint(entry)
# ->
# OrderedDict([('id', '0001'), ('name', 'NAME1'), ('address', 'A1')])
# OrderedDict([('id', '0002'), ('name', 'NAME2'), ('address', 'A2')])
# OrderedDict([('id', '0003'), ('name', 'NAME3'), ('address', 'A3')])
# OrderedDict([('id', '0004'), ('name', 'NAME4'), ('address', 'A4')])
# OrderedDict([('id', '0005'), ('name', 'NAME5'), ('address', 'A1')])
Индексирование записей по id
Если вы хотите сравнить данные, которые имеюттот же id , вы можете хранить данные в отображении, которое связывает id и другие файлы:
data_mapping = {}
with io.open(csv_path, mode="r", encoding="utf-8") as f:
reader = csv.DictReader(f, header, delimiter=delimiter)
for entry in reader:
data_id = entry.pop('id')
data_mapping[data_id] = entry
Запрос к базе данных
Для базы данных вы можете перебирать каждую запись вместо выборки всех записей: вместо этого вы можете использовать fetchone
.Но, на самом деле, вы можете использовать курсор в качестве итератора.
Вот пример:
import pymysql
connection = pymysql.connect(host='localhost',
user='root',
password='password',
db='test',
charset='utf8',
cursorclass=pymysql.cursors.DictCursor)
try:
with connection.cursor() as cursor:
# Using the cursor as iterator
cursor.execute("SELECT * FROM HistoricalTable")
for row in cursor:
print(row)
finally:
connection.close()