仅查找一个csv中存在但不存在另一个csv的行

时间:2017-04-24 06:04:53

标签: python csv awk

CSV_1.csv具有以下结构:

ABC
DEF
GHI
JKL
MNO
PQR

CSV_2.csv具有以下结构:

XYZ
DEF
ABC

CSV_2.csvCSV_1.csv小很多,CSV_2.csv中存在的很多行都会出现在CSV_1.csv中。我想知道CSV_2.csv中是否存在行,CSV_1.csv中是否存在行。

这些文件未排序。

较大的csv接近1000万行,较小的表有大约700万行。

我该怎么做呢?我尝试了python,但从CSV_2.csv获取每一行并与CSV_1.csv中的1000万行进行比较需要花费大量时间。

以下是我在python中尝试的内容:

with open('old.csv', 'r') as t1, open('new.csv', 'r') as t2:
    fileone = t1.readlines()
    filetwo = t2.readlines()

with open('update.csv', 'a') as outFile:
    for line in filetwo:
        if line not in fileone:
            outFile.write(line)
想到了{p> awkawk的确切代码是什么?

4 个答案:

答案 0 :(得分:2)

是的,你的方法非常低效。以下内容应该更快,使用O(1)集合的查找时间,并在t2懒惰地遍历行:

with open('old.csv', 'r') as t1, open('new.csv', 'r') as t2:
    fileone = frozenset(t1)

    with open('update.csv', 'a') as outFile:
        for line in t2:
            if line not in fileone:
                outFile.write(line)

答案 1 :(得分:0)

为了加速python实现,您应该使用快速查找的数据结构。您应该尝试set

变化:

fileone = t1.readlines()

要:

fileone = set(t1.readlines())

这将大大加快界限:

if line not in fileone:

答案 2 :(得分:0)

您可以使用pandas数据帧。 从csv。

创建2个数据帧
import pandas as pd
df1= pd.DataFrame.from_csv('CSV_1.csv')
df2= pd.DataFrame.from_csv('CSV_2.csv')
>>> df1
   val
0  ABC
1  DEF
2  GHI
3  JKL
4  MNO
5  PQR
>>> 
>>> df2
   val
0  XYZ
1  DEF
2  ABC
>>> df = pd.merge(df1, df2, how='outer', indicator=True)
>>> df
   val      _merge
0  ABC        both
1  DEF        both
2  GHI   left_only
3  JKL   left_only
4  MNO   left_only
5  PQR   left_only
6  XYZ  right_only
>>> uniqueRowsInCsv2 = df[ df['_merge'] == 'right_only' ]
>>> uniqueRowsInCsv2
   val      _merge
6  XYZ  right_only
>>> 

答案 3 :(得分:0)

您可以加载数据并使用设置差异操作来加速:

with open('old.csv', 'r') as t1, open('new.csv', 'r') as t2:
    old_set = set(t1.readlines())
    new_set = set(t2.readlines())

# values in new_set but not in old_set
differences =  new_set.difference(old_set)
with open('update.csv', 'a') as outFile:
    for difference in differences:
        outFile.write(difference)