所以我有两个CSV文件,我试图比较并得到类似项目的结果。 第一个文件hosts.csv如下所示:
Path Filename Size Signature
C:\ a.txt 14kb 012345
D:\ b.txt 99kb 678910
C:\ c.txt 44kb 111213
第二个文件masterlist.csv如下所示:
Filename Signature
b.txt 678910
x.txt 111213
b.txt 777777
c.txt 999999
如您所见,行不匹配,masterlist.csv始终大于hosts.csv文件。我只想搜索签名部分。我知道这看起来像是:
hosts[3] == masterlist[1]
我正在寻找一个解决方案,它将提供如下内容(基本上是hosts.csv文件和一个新的结果列):
Path Filename Size Signature RESULTS
C:\ a.txt 14kb 012345 NOT FOUND in masterlist
D:\ b.txt 99kb 678910 FOUND in masterlist (row 1)
C:\ c.txt 44kb 111213 FOUND in masterlist (row 2)
我已经搜索了这些帖子,发现了一些类似于here的东西,但是我不太明白,因为我还在学习python。
使用Python2.6编辑
编辑:当我的解决方案正常工作时,请查看下面Martijn的答案以获得更有效的解决方案。
您可以找到python CSV模块here的文档。
你要找的是这样的东西:
Python的CSV和collections模块,特别是OrderedDict,在这里非常有用。你想使用OrderedDict来维护密钥的顺序,等等。你不必这么做,但它很有用!
下面是使用测试CSV文件的输出:
请原谅偏差,它们是分开的:)
srgerg的答案是非常低效的,因为它在二次时间内运行;下面是一个线性时间解决方案,它使用了Python 2.6兼容的语法:
这将生成一个字典,首先将签名从
masterlist.csv
映射到行号。在字典中查找需要恒定的时间,使第二个循环在hosts.csv
行上,独立于masterlist.csv
中的行数。更不用说更简单的代码了。对于那些使用Python 3的用户,上面的调用只需要将
open()
调整为以文本模式打开(从文件模式中删除b
),并且您希望添加new line=''
,这样CSV读取器就可以控制行分隔符。您可能希望声明要显式使用的编码,而不是依赖于系统默认值(使用encoding=...
)。可以通过字典理解({r[1]: i for i, r in enumerate(csv.reader(master))}
)来构建master_indices
映射。相关问题 更多 >
编程相关推荐