Python 仅查找一个csv中存在的行,而不查找另一个csv中存在的行

Python 仅查找一个csv中存在的行,而不查找另一个csv中存在的行,python,csv,awk,Python,Csv,Awk,CSV_1.CSV具有以下结构: ABC DEF GHI JKL MNO PQR XYZ DEF ABC CSV_2.CSV具有以下结构: ABC DEF GHI JKL MNO PQR XYZ DEF ABC CSV_2.CSV比CSV_1.CSV小得多,CSV_2.CSV中存在的许多行出现在CSV_1.CSV中。我想知道是否有行存在于CSV_2.CSV中,但不存在于CSV_1.CSV中 这些文件没有排序 较大的csv有近1000万行,较小的表有约700万行 我该怎么做呢?我尝试了py

CSV_1.CSV
具有以下结构:

ABC
DEF
GHI
JKL
MNO
PQR
XYZ
DEF
ABC
CSV_2.CSV
具有以下结构:

ABC
DEF
GHI
JKL
MNO
PQR
XYZ
DEF
ABC
CSV_2.CSV
CSV_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)

awk
浮现在脑海中。awk的确切代码是什么?

要加快python实现,应该使用快速查找的数据结构。您应该尝试设置

更改:

fileone = t1.readlines()
致:

这将大大加快生产线的速度:

if line not in fileone:

是的,你的方法效率很低。使用集合的
O(1)
lookup time,并惰性地迭代
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)

您可以使用数据帧。 从两个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
>>> 

您可以在集合中加载数据,并使用集合差异操作来加速:

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)

看看吧,它有很多经过充分研究的答案。选择一个适合你需要的。你可以回答以下问题:@Inian你链接的那个不能回答我的问题。在这里,我还研究了其他类似的问题。@user2125722我已经试过python了。非常非常慢。如果您尝试过python,您应该共享它,以便有人可以帮助您。您的解决方案给了我:fileone=frozenset(1)TypeError:“int”对象不是iterable@Shoumik这不是我的解决方案,我写了
fileone=frozenset(t1)
,所以
frozenset(**t1**)
不是
frozenset(1)