我正在尝试计算两个大型 csv 文件(~ 4GB)之间的差异以获取新添加的行并将它们写入输出 csv 文件。通过使用以下代码,我能够为相对较小的文件(~50MB)获得此功能。
input_file1 = "data.csv"
input_file2 = "data_1.csv"
output_path = "out.csv"
with open(input_file1, 'r') as t1, open(input_file2, 'r') as t2:
fileone = t1.readlines()
filetwo = t2.readlines()
with open(output_path, 'w') as outFile:
for line in filetwo:
if line not in fileone:
outFile.write(line)
Run Code Online (Sandbox Code Playgroud)
但是,对于较大的文件,上述代码要么太慢(运行约半小时),要么因内存空间不足而崩溃。
有没有更快的方法来获取大型 csv 文件的差异?
首先,请注意这里的错字:
with open(input_file2, 'r') as t1, open(input_file2, 'r') as t2:
Run Code Online (Sandbox Code Playgroud)
您正在阅读同一文件 ( input_file2)
然后,您不必完全阅读第二个文件,只需逐行阅读即可。
为了速度,只需制作set第一个文件(快速查找,如果有重复行,则节省内存)。为此,您必须在写入结果时保持第二个文件处于打开状态:
input_file1 = "data.csv"
input_file2 = "data_1.csv"
output_path = "out.csv"
with open(input_file1, 'r') as t1:
fileone = set(t1)
with open(input_file2, 'r') as t2, open(output_path, 'w') as outFile:
for line in t2:
if line not in fileone:
outFile.write(line)
Run Code Online (Sandbox Code Playgroud)
for line in t2逐行读取文件(readlines()如果可以,请始终避免),因此即使文件很大,内存占用也很小。fileone 需要一些内存,是的,但希望它更小和/或有重复的行,不是那么多,当然比 readlines()if line not in fileone可能看起来和以前一样,但它具有平均 O(1)复杂度,这使得程序更快