我有一个包含各种列的csv(full_log.csv)。其中一列标记为“HASH”,并包含该行中显示的文件的哈希值。例如,我的列将具有以下标题:
我需要我的python脚本来获取另一个只包含1列多个哈希值的CSV(hashes.csv),并将哈希值与我的full_log.csv中的HASH列进行比较。
无论何时找到匹配项,我都希望它将包含哈希值的整行输出到另一个CSV(output.csv)。所以我的output.csv将只包含full_log.csv的行,这些行包含在hashes.csv中找到的任何哈希值,如果这有意义的话。
到目前为止,我有以下内容。它适用于我在脚本中手动输入的哈希值,但现在我需要它来查看hashes.csv来比较而不是手动将哈希值放在脚本中,而不是打印结果我需要将它们导出到输出.csv格式。
import csv
with open('full_log.csv', 'rb') as input_file1:
reader = csv.DictReader(input_file1)
rows = [row for row in reader if row ['HASH'] == 'FB7D9605D1A38E38AA4C14C6F3622E5C3C832683']
for row in rows:
print row
答案 0 :(得分:3)
我会从set
文件中生成hashes.csv
。使用该集合中的成员资格作为过滤器,我将迭代full_log.csv
文件,仅输出那些匹配的行。
import csv
with open('hashes.csv') as hashes:
hashes = csv.reader(hashes)
hashes = set(row[0] for row in hashes)
with open('full_log.csv') as input_file:
reader = csv.DictReader(input_file)
with open('output.csv', 'w') as output_file:
writer = csv.DictWriter(output_file, reader.fieldnames)
writer.writeheader()
writer.writerows(row for row in reader if row['Hash'] in hashes)
答案 1 :(得分:1)
查看python的pandas lib: http://pandas.pydata.org/pandas-docs/stable/
它为您的问题提供了各种有用的功能,可以轻松读取,转换和写入csv文件
答案 2 :(得分:0)
遍历文件和散列行并使用带any
的过滤器返回散列集合中的匹配项:
matching_rows = []
with open('full_log.csv', 'rb') as file1, open('hashes.csv', 'rb') as file2:
reader = csv.DictReader(file1)
hash_reader = csv.DictReader(file2)
matching_rows = [row for row in reader if any(row['Hash'] == r['Hash'] for r in hash_reader)]
with open('output.csv', 'wb') as f:
writer = csv.DictWriter(f)
writer.writerows(matching_rows)
答案 3 :(得分:0)
我有点不清楚你需要多少帮助来解决这个问题。我将假设您不需要完整的解决方案,而只需提供有关如何制定解决方案的提示。
第一个问题,哪个档案更大?如果你知道hashes.csv不是太大,意味着它将适合内存而没有问题,那么我只是简单地将该文件一行吸入一行并将每个散列条目存储在Set变量中。我不会提供完整的代码,但一般结构如下:
hashes = Set()
for each line in the hashes.csv file
hashes.add(hash from the line)
现在,我相信您已经知道如何阅读CSV文件,因为您上面有一个示例,但是,您要做的是现在遍历完整日志CSV文件中的每一行。对于这些行中的每一行,不要检查散列是否是特定值,而是检查该值是否包含在散列变量中。如果是,则使用CSV编写器将单行写入文件。
我认为,最大的问题是知道哈希是否总是在特定情况下,以便您可以执行比较。例如,如果一个文件使用大写字母表示HASH而另一个文件使用小写字母,则需要确保转换为使用相同的大小写。