Python:比较2个文本文件的最佳方法?

时间:2016-07-10 04:19:38

标签: python windows file python-3.x

我有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 )

此代码有效,但需要很长时间才能完成。那么,如何加快代码流程呢?

任何帮助都将非常感谢! :)

3 个答案:

答案 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)