检查csv文件是否具有相同的项目

时间:2017-05-14 14:28:08

标签: python list csv

我有两个.csv文件。一个有info1,一个有info2。文件看起来像这样 文件1:

20170101,,,d,4,f,SWE
20170102,a,,,d,f,r,RUS  <-

文件2:

20170102,a,s,w,,,,RUS  <-
20170103,d,r,,,,FIN

我想将这两行合并(标记为&#34;&lt; - &#34;)并组合如下:

20170102,a,s,w,d,f,r,RUS 

我知道我可以做类似这样的脚本:

for row1 in csv_file1:
    for row2 in csv_file2:
        if (row1[0] == row2[0] and row1[1] == row2[1]):
            do something

有没有其他方法可以找出哪些行在开头有相同的项目,或者这是唯一的方法吗?这是找出相似之处的非常缓慢的方法,并且在10万行文件上运行需要几分钟。

1 个答案:

答案 0 :(得分:3)

您的实施是O(n^2),将一个文件中的所有行与另一个文件中的所有行进行比较。如果你为第一个文件中的每一行重新读取第二个文件,那就更糟了。

您可以通过根据第一个文件的内容构建索引来显着提高速度。索引可以像字典一样简单,文件的第一列作为键,行作为值。 您可以在第一个文件的一次传递中构建该索引。 然后在第二个文件上传递一个, 如果id在索引中,则检查每一行。 如果是,则打印合并的行。

index = {row[0]: row for row in csv_file1}

for row in csv_file2:
    if row[0] in index:
        # do something

特别感谢@martineau构建索引的dict comprehension版本。

如果第一个文件中有多个具有相同ID的项目, 然后索引可以指向这些行的列表:

index = {}
for row in csv_file1:
    key = row[0]
    if key not in index:
        index[key] = []
    index[key].append(row)

使用defaultdict

可以简化一下
from collections import defaultdict

index = defaultdict(list)
for row in csv_file1:
    index[rows[0]].append(row)