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)