将非常大的文本文件(超过 100 GB)中的字符串与小文本文件(大约 30 行)进行比较,并打印两个文件中包含的所有字符串

问题描述 投票:0回答:1

我有两个文本文件。一个包含非常长的字符串列表 (100 GB),另一个包含大约 30 个字符串。我需要找到第二个文件中的哪些行也在第一个文件中,并将它们写入另一个第三个文本文件。手动搜索每一行很痛苦,所以我想编写一个脚本来自动完成它。 为此,我选择 Python,因为它是我唯一了解一点点的语言。

本质上我尝试复制这个答案,因为我太缺乏经验,无法编写自己的代码:比较Python中的2个文件并将差异提取为字符串

smallfile = 'smalllist.txt'
bigfile = 'biglist.txt'



def file_2_list(file):
    with open(file) as file:
        lines = file.readlines()
        lines = [line.rstrip() for line in lines]
        return lines


def diff_lists(lst1, lst2):
    differences = []
    both = []
    for element in lst1:
        if element not in lst2:
            differences.append(element)
        else:
            both.append(element)
    return(differences, both)


listbig = file_2_list(bigfile)
listsmall = file_2_list(smallfile)

diff, both = diff_lists(listbig, listsmall)

print(both)

我希望它打印出两个列表中的行。 然而它给了我一个“记忆错误”。但我已经在使用 64 位版本的 Python,所以内存限制应该不是问题? (我有 16 GB 内存)

那么如何避免这种“记忆错误”呢?或者也许有更好的方法来完成这项任务?

python memory compare extract difference
1个回答
0
投票

file.readlines()
方法将整个文件读取到内存中,当文件很大时应该避免这种情况。

您可以将较小文件的行读入集合中,然后迭代大文件的行,通过测试行是否在集合中来查找公共行:

def common_lines(small_file, big_file):
    small_lines = set(small_file)
    return [line for line in big_file if line in small_lines]

with open(smallfile) as file1, open(bigfile) as file2:
    both = common_lines(file1, file2)
© www.soinside.com 2019 - 2024. All rights reserved.