【问题标题】:Compare CSV Values Against Another CSV And Output Results比较 CSV 值与另一个 CSV 并输出结果
【发布时间】:2016-11-10 04:51:19
【问题描述】:

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

【问题讨论】:

  • 将所有哈希值读入一个列表,然后使用List.index()函数判断是否有任何给定的哈希值在列表中。

标签: python csv


【解决方案1】:

我会从hashes.csv 文件中生成一个set。使用该集合中的成员身份作为过滤器,我将遍历 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)

【讨论】:

    【解决方案2】:

    查看 python 的 pandas lib: http://pandas.pydata.org/pandas-docs/stable/

    它对您的问题有各种有用的功能,轻松读取、转换和写入 csv 文件

    【讨论】:

      【解决方案3】:

      遍历文件行和散列,并使用带有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)
      

      【讨论】:

        【解决方案4】:

        我有点不清楚您在解决这个问题时需要多少帮助。我将假设您不需要完整的解决方案,而只是简单地提示如何制作您的解决方案。

        第一个问题,哪个文件更大?如果您知道 hashes.csv 不是太大,这意味着它可以毫无问题地放入内存中,那么我只需将该文件一次放入一行并将每个哈希条目存储在 Set 变量中。我不会提供完整的代码,但大致的结构如下:

        hashes = Set()
        for each line in the hashes.csv file
            hashes.add(hash from the line)
        

        现在,我相信您已经知道如何读取 CSV 文件,因为您有上面的示例,但是,您现在要做的是遍历完整日志 CSV 文件中的每一行。对于每一行,不要检查哈希是否是特定值,而是检查该值是否包含在哈希变量中。如果是,则使用 CSV 编写器将单行写入文件。

        我认为,最大的问题是知道哈希是否总是在特定情况下,以便您可以执行比较。例如,如果一个文件使用大写的 HASH 而另一个使用小写,那么您需要确保转换为使用相同的大小写。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-08-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-01-31
          • 2022-01-24
          相关资源
          最近更新 更多