Python 在两个文本文件中匹配行

Python 在两个文本文件中匹配行,python,Python,我有两个文本文件,第一个文件是40GB(数据2),第二个大约是50MB(数据1) 我想检查file1中的任何一行是否与file2中的任何一行匹配,因此我编写了一个python脚本(如下所示)来执行此操作,使用此脚本的过程花费了太多的时间,因为它从file1中取出一行,然后逐行检查整个file2 for line in open("data1.txt","r"): for line2 in open("data2.txt","r"): if line==line2:

我有两个文本文件,第一个文件是40GB(数据2),第二个大约是50MB(数据1) 我想检查file1中的任何一行是否与file2中的任何一行匹配,因此我编写了一个python脚本(如下所示)来执行此操作,使用此脚本的过程花费了太多的时间,因为它从file1中取出一行,然后逐行检查整个file2

for line in open("data1.txt","r"):
    for line2 in open("data2.txt","r"):
        if line==line2:
            print(line)

有没有什么方法/代码可以让这变得很快?脚本已运行5天,但仍未完成。是否还有方法显示正在处理的%或当前行号?

使用集合并反转逻辑,检查大数据文件中的任何行是否在f2行集合中,f2行集合是较小的50mb文件:

with open("data1.txt", "r") as f1, open("data2.txt", "r") as f2:
    lines = set(f1) # efficient 0(1) lookups using a set
    for line in f2: # single pass over large file 
        if line in lines:
            print(line)
如果需要行号,请使用枚举:

with open("data1.txt", "r") as f1, open("data2.txt", "r") as f2:
        lines = set(f1) # efficient 0(1) lookups using a set
        for lined_no, line in enumerate(f2, 1): # single pass over large file      
            # print(line_no) # uncomment if you want to see every line number
            if line in lines:
                print(line,line_no)

使用集合并反转逻辑,检查大数据文件中的任何行是否在f2的行集合中,f2是较小的50mb文件:

with open("data1.txt", "r") as f1, open("data2.txt", "r") as f2:
    lines = set(f1) # efficient 0(1) lookups using a set
    for line in f2: # single pass over large file 
        if line in lines:
            print(line)
如果需要行号,请使用枚举:

with open("data1.txt", "r") as f1, open("data2.txt", "r") as f2:
        lines = set(f1) # efficient 0(1) lookups using a set
        for lined_no, line in enumerate(f2, 1): # single pass over large file      
            # print(line_no) # uncomment if you want to see every line number
            if line in lines:
                print(line,line_no)

您有大文件,所以这需要时间,但另一种方法是读取
data1
(50MB)的数据并存储在list
文件中。readlines()
将返回列表。从
data2
读取数据,并检查其是否存在于
列表中。这样可以避免每次读取
data1
。只有一次读取。@Padraic Cunningham我不确定我是否理解你,但是,我已经用data2颠倒了data1,所以它会检查大文件(取行),然后逐行读取小文件。。你有大文件,所以这需要时间,但另一种方法是,读取
data1
(50MB)的数据并存储在列表
file.readlines()
将返回您的列表。从
data2
读取数据,并检查其是否存在于
列表中。这样可以避免每次读取
data1
。只读取一次。@Padraic Cunningham我不确定是否理解您的意思,但是,我已经用data2反转了data1,所以它会检查大文件(取行),然后逐行读取小文件。@Padraic Cunningham set(f2)给了MemoryError,所以我反转了文件以列出较小的文件。我现在在等结果。还有什么方法可以显示%或当前行号吗?@xhxx,我把数据弄混了,我想数据2是较小的。我更新了答案,如果你想要我们可以使用的行号,没有问题,我会避免对每一行使用打印,更好的方法是添加和
如果行号%1000000==0:print(行号)
,那么每一百万行@Padraic Cunningham之后你就会得到更新,太棒了!!Thanks@xhxx,尝试使用多处理的代码,我已经很长时间没有使用该模块了,也不确定所有内容是否正确,但可能值得尝试@Padraic Cunningham集合(f2)给出了MemoryError,因此我将文件反转为列出较小的文件。我现在在等结果。还有什么方法可以显示%或当前行号吗?@xhxx,我把数据弄混了,我想数据2是较小的。我更新了答案,如果你想要我们可以使用的行号,没有问题,我会避免对每一行使用打印,更好的方法是添加和
如果行号%1000000==0:print(行号)
,那么每一百万行@Padraic Cunningham之后你就会得到更新,太棒了!!Thanks@xhxx,尝试使用多处理的代码,我已经很长时间没有使用该模块了,也不确定所有内容是否正确,但可能值得尝试。