我有两个文本文件。一个包含非常长的字符串列表 (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 内存)
那么如何避免这种“记忆错误”呢?或者也许有更好的方法来完成这项任务?
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)