Я пытаюсь сделать несколько сложную разницу между отдельными строками в двух файлах CSV. Мне нужно убедиться, что строки из одного файла не появятся в другом файле, но мне не дают никакой гарантии порядка строк в обоих файлах. В качестве отправной точки я пытался сравнить хэши строковых представлений строк (то есть списков Python). Например:
import csv
hashes = []
for row in csv.reader(open('old.csv','rb')):
hashes.append( hash(str(row)) )
for row in csv.reader(open('new.csv','rb')):
if hash(str(row)) not in hashes:
print 'Not found'
Но это с треском проваливается. Я ограничен искусственно наложенными ограничениями памяти, которые я не могу изменить, и поэтому я использовал хеш-коды вместо непосредственного хранения и сравнения списков. Некоторые файлы, которые я сравниваю, могут иметь размер сотен мегабайт . Любые идеи для способа точного сжатия списков Python, чтобы их можно было сравнить с точки зрения простого равенства с другими списками? То есть система хеширования, которая на самом деле работает? Бонусные баллы : почему не работает вышеуказанный метод?
EDIT:
Спасибо за все замечательные предложения! Позвольте мне уточнить некоторые вещи. «Несчастный сбой» означает, что две строки с одинаковыми данными после считывания объектом CSV.reader
не хешируют одно и то же значение после вызова str
объекта списка. Я попробую hashlib
в некоторых предложениях ниже. Я также не могу сделать хэш для необработанного файла, так как две строки ниже содержат одинаковые данные, но разные символы в строке:
1, 2.3, David S, Monday
1, 2.3, "David S", Monday
Я также уже занимаюсь такими вещами, как разбор строк, чтобы сделать данные более однородными, но, похоже, это бесполезно. Я не ищу чрезвычайно умной логики сравнения, то есть 0
совпадает с 0.0
.
РЕДАКТИРОВАТЬ 2:
Проблема решена. Что в основном сработало, так это то, что мне нужно было немного больше предварительного форматирования, например, конвертировать целые и плавающие числа и т. Д. И Мне нужно было изменить функцию хеширования. Оба эти изменения, казалось, сделали работу для меня.