我有两个.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万行文件上运行需要几分钟。
答案 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)