将CSV值与另一个CSV和输出结果进行比较

时间:2016-07-07 18:25:00

标签: python csv

我有一个包含各种列的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

4 个答案:

答案 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而另一个文件使用小写字母,则需要确保转换为使用相同的大小写。