CSV_1.csv
具有以下结构:
ABC
DEF
GHI
JKL
MNO
PQR
CSV_2.csv
具有以下结构:
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)
想到了{p> awk
。 awk
的确切代码是什么?
答案 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)