저는 두 개의 CSV 파일에서 개별 행 사이의 다소 복잡한 diff를 시도하고 있습니다. 한 파일의 행이 다른 파일에 나타나지 않도록해야하지만 은 두 파일의 행의 순서를 보장하지 않습니다. 출발점으로, 행의 문자열 표현 (예 : 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'
그러나 이것은 비참하게 실패합니다. 나는 변경할 수없는 인위적으로 부과 된 메모리 한계에 의해 제약을 받고 있으며 따라서 목록을 직접 저장하고 비교하는 대신 해시를 사용했습니다. 비교할 파일 중 일부는 수백 메가 바이트 크기 일 수 있습니다. 파이썬리스트를 정확하게 압축하는 방법에 대한 아이디어는 다른리스트와 단순한 평등의 관점에서 비교할 수 있습니까? 나는. 실제로 작동하는 해시 시스템? 보너스 포인트 : 왜 위의 방법이 효과가 없었습니까?
편집 : 모든 위대한 제안
감사합니다! 내가 몇 가지를 분명히하자. "Miserable failure"는 CSV.reader
개체에서 읽은 후 정확히 동일한 데이터를 가진 두 행이 목록 개체에서 str
을 호출 한 후 동일한 값으로 해싱되지 않음을 의미합니다. 나는 아래의 몇 가지 제안에서 hashlib
을 시도 할 것입니다. ,
1, 2.3, David S, Monday
1, 2.3, "David S", Monday
나는 이미 데이터를 균일하게 제거 문자열과 같은 일을하고있다 : 나는 또한 두 줄 아래 줄에 동일한 데이터,하지만 서로 다른 문자를 포함하기 때문에, 원시 파일의 해시를 할 수 없어 그러나 그것은 아무 소용이없는 것처럼 보인다. 나는 매우 똑똑한 diff 논리를 찾고 있지 않습니다. 즉 0
은 0.0
과 같습니다.
EDIT 2 해결
문제. 기본적으로 작동하는 것은 정수 및 부동 소수점을 변환하는 것과 같은 좀 더 사전 형식화가 필요하다는 것입니다. 및 해시 함수를 변경해야했습니다. 이 두 가지 변화는 나를 위해 일하는 것처럼 보였다.
어떻게 작동하지 않는지 더 자세히 말할 수 있습니까? –
왜 세트를 사용하지 않습니까? 왜리스트인가? –
@Ned 기본적으로 두 파일에서 두 weare가 동일하면 내 코드가 동일한 해시를 얻지 못했습니다.이유가 무엇인지, CSV에서 문자열 방식으로, 또는 독자가 파일을 다르게 읽는 방식에서 실패했을 수있는 많은 단계가 있는지 확신 할 수 없습니다. @ S.Lott 실제로 해시 행 쌍 사전을 사용하고 있었지만 샘플 코드를 더 간단하게 유지하려고했습니다. – daveslab