【发布时间】:2026-02-14 13:35:01
【问题描述】:
我正在尝试在两个 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 列表的方法的任何想法,以便可以将它们与其他列表的简单相等性进行比较? IE。一个真正有效的散列系统? 加分:为什么上面的方法不起作用?
编辑:
感谢所有伟大的建议!让我澄清一些事情。 “悲惨的失败”意味着具有完全相同数据的两行在被CSV.reader 对象读入后,在对列表对象调用str 后没有散列到相同的值。我将在下面的一些建议中尝试hashlib。我也无法对原始文件进行哈希处理,因为下面的两行包含相同的数据,但行上的字符不同:
1, 2.3, David S, Monday
1, 2.3, "David S", Monday
我也已经在做诸如字符串剥离之类的事情,以使数据更加统一,但似乎无济于事。我不是在寻找一个非常聪明的差异逻辑,即0 与0.0 相同。
编辑 2:
问题解决了。基本上起作用的是我需要更多的预格式化,比如转换整数和浮点数,等等 AND 我需要更改我的散列函数。这两个变化似乎都对我有用。
【问题讨论】:
-
你能说更多关于它是如何不起作用的吗?
-
你为什么不用一套?为什么是列表?
-
@Ned 基本上,如果两个文件中的两个相同,我的代码没有为它们获得相同的哈希值。我不知道为什么,在 CSV 到字符串的方法中,或者在读者如何以不同的方式读取文件时,它可能会失败很多步骤。 @S.Lott 我实际上使用的是哈希行对字典,但我想让示例代码更简单。
标签: python list comparison hash