【问题标题】:Compare two csv file content and store the similar into variable比较两个 csv 文件内容并将相似的内容存储到变量中
【发布时间】:2012-08-01 23:14:29
【问题描述】:

我真的是 python 新手,我有两个 csv 文件。第一个(more.csv)的内容为

A123,B456,C789

第二个(less.csv)的内容为

B456

我希望当它们相同时,它们将相似的项目存储到一个名为“相同”的变量中

我认为它会以这样的开头:

more = open('more.csv','r')
less= open('less.csv','r')
for item in unitid:

谢谢。

【问题讨论】:

  • “当它们相同时”是什么意思?您的意思是当它们都包含相同的值(例如都具有 B456)时?
  • 您的 csv 文件是否每个仅包含一行;如果没有,请至少在示例的第二行
  • 是的,每行只有一行。

标签: python csv compare


【解决方案1】:

如果它们只有一行,你可以使用 set 对象(python 内置)来比较它们,例如:

>>> a = ['A123','B456','C789','D007']
>>> b = ['B456','D007','E009']
>>> c = list(set(a).intersection(b))
>>> print c
['B456', 'D007']

比较文件的完整方法如下所示:

def compare( fileA, fileB ):
    a_file = open(fileA, 'r')
    a_data = a_file.read()
    a_file.close()

    b_file = open(fileB, 'r')
    b_data = b_file.read()
    b_file.close()

    # compare the contents
    a_set = set(a_data.split(','))
    b_set = set(b_data.split(','))

    return list(a_set.intersection(b_set))

compare('more.csv', 'less.csv')

如果每个文件不止一行,那么你仍然可以使用它,你只需要稍微修改一下 - 我想将交叉点存储到一个表示逐行的数组中-line 相似性什么的。

【讨论】:

    【解决方案2】:

    将 CSV 文件处理成列表后,您可以使用 collections.Counter 查找重复项:

    from collections import Counter
    
    # after processing your CSV files into two lists:
    more_list = ['A123', 'B456', 'C789', 'D007']
    less_list = ['B456', 'D007', 'E009']
    
    dupe_counter = Counter(more_list)
    dupe_counter.update(less_list)
    same_list = [val for val in dupe_counter if dupe_counter[val] > 1]
    # same_list will be: ['B456', 'D007']
    

    【讨论】:

    • 有没有办法不使用列表而只使用 csv.reader 和 for 循环?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多