我有2个文件:文件A包含200 000行;文件B包含4 000 000行。所以,我想比较这些文件并打印不在文件B中的行。
例如: 文件A:
1
2
3
档案B:
1
4
5
6
7
输出:
2
3
以下是我的代码:
for line in open ( 'C:/A.txt' ):
if line not in open ( 'C:/B.txt' ):
print ( line )
此代码有效,但需要很长时间才能完成。那么,如何加快代码流程呢?
任何帮助都将非常感谢! :)
答案 0 :(得分:2)
创建一个文件B中线条散列的集合 - 并将A中的线条与此集合中的线条进行比较 -
这样的设置将占用大约一百兆的内存,因此应该适合笔记本或工作站的内存:
None <type 'NoneType'>
这里的主要速度是,与在fileB中线性搜索一行不同,它只读取一次 - 并且每一行都在一组中可用,它具有恒定的查找时间。因此,你从~200,000×4,000,000比较(O(m×n))下降到仅约200,000比较(O(m×1))。
更不用说不需要将filsystem中的数据移动到程序存储器200.000次左右。
通过仅保留B中的linesB = {hash(line) for line in open("fileB"))}
for line in open("fileA"):
if hash(line) not in linesB:
print (line)
行,您可以避免将fileB的所有文本信息保存在内存中 - 每个哈希(在64位系统中)只需24个字节 - 而不是文本信息本身(取决于每行的长度+其散列。
答案 1 :(得分:1)
更快的方法是打开文件一次并使用集合:
with open('C:/A.txt') as a:
with open('C:/B.txt') as b:
lines = set(b)
for line in a:
if line not in lines:
print(line)
也许更好的方法是这样的:
with open('C:/A.txt') as a, open('C:/B.txt') as b:
lines = set()
for line in a:
if line not in lines:
for line_b in b:
lines.add(line_b)
if line_b == line:
break
else:
print(line)
答案 2 :(得分:1)
您可以使用set difference
操作获取这些文件中不匹配的所有行。
with open('A.txt') as a:
contentA = set(a)
with open('B.txt') as b:
contentB = set(b)
print(contentA - contentB)
编辑: 反向操作,打印不在A中的文件B的内容现在只是
print(contentB - contentA)