计算两个 csv 文件之间差异的更快方法

ipr*_*214 4 python csv

我正在尝试计算两个大型 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 文件的差异?

Jea*_*bre 5

首先,请注意这里的错字:

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)复杂度,这使得程序更快