python-比较文件A和文件B

python-比较文件A和文件B,python,Python,我是python新手。我想创建一个脚本来比较两个文件,输出将包含匹配的文本 我想比较文件1和文件2。两个文件的每一行都包含电子邮件地址 要找出差异: >>> from difflib import ndiff >>> diff = ndiff(file('1').readlines(),file('2').readlines()) >>> print ''.join(diff), 若要显示反向差异,只需添加(如果): $ cat /tmp/

我是python新手。我想创建一个脚本来比较两个文件,输出将包含匹配的文本


我想比较文件1和文件2。两个文件的每一行都包含电子邮件地址

要找出差异:

>>> from difflib import ndiff
>>> diff = ndiff(file('1').readlines(),file('2').readlines())
>>> print ''.join(diff),
若要显示反向差异,只需添加
(如果
):

$ cat /tmp/1 
hello@world.net
goodbye@cruelworld.com
$ cat /tmp/2
hello@world.net
goodbye@cruelworld.com
hello-once-again@example.com

$ python
>>> diff = ndiff(file('/tmp/1').readlines(),file('/tmp/2').readlines())
>>> print ''.join([x for x in diff if x[0] not in '-+']),
  hello@world.net
  goodbye@cruelworld.com

解决这类问题的关键不是考虑“文件”,而是考虑数据。什么是文件?这只是一堆台词。所以你只是在问如何从一个iterable中找到另一个iterable中的所有值。那很容易

with open('file1') as f1, open('file2') as f2:
    matches = set(f1).intersection(f2)
set
构造函数像文件一样接受任何iterable并对其进行设置

intersection
方法像文件一样接受任何iterable,并提供
self
集合和该iterable中的所有元素。因此,在本例中,所有元素都位于file1所有行的集合中,以及file2所有行的iterable中


下面是一个示例来说明它的工作原理:

文件1:

johndoe@example.com
marysmith@example.com
rowdyroddypiper@example.com
文件2:

janesmith@example.com
rowdyroddypiper@example.com
jackjohnson@example.com
marysmith@example.com
代码:


这当然需要将整个
file1
读入内存。如果不可能,最有效的替代方法可能是对这两个文件进行脱机排序,然后对它们进行迭代

但更简单的解决方案是使用
dbm
(具有无意义的值)作为磁盘集。我拍打在一起。它需要Python3.3+,可能在Windows上有问题,只处理
str
元素,并且只支持plus
intersection
的最小API;如果您需要旧版本、可移植性、不同的密钥类型、更好的错误处理等,可能需要3分钟以上的时间。无论如何:

>>> import dset
>>> with open('file1') as f1, open('file2') as f2:
...     matches = dset.DiskSet(f1).intersection(f2)

对于中等大小的文件来说,任何磁盘上的解决方案显然都要慢得多,但当您遇到无法放入内存的大型文件时,或者更糟糕的是,只有将整个计算机投入到交换地狱中时,您才能找到适合的大型文件,它显然赢了。

你不能使用超越比较吗?请发布你已经尝试过的代码示例。我完全同意Tom Swifty的观点。要求为您解决问题不是stackoverflow背后的想法。这显示了不同的行,而不是匹配的行。@abanert:谢谢您的好提示!固定的!非常感谢。这将为您提供带前缀的参考线以及带前缀的公共线。另外,这只会在两个文件中找到位置相同的匹配项,我怀疑他是想这么做的。@另一个测试:不,文件是由行组成的,不是由字符组成的。是的,如果文件不太大,我会这样做。@cmd:如果文件太大,我也会这样做,只要使用基于磁盘的
。磁盘上的排序比磁盘上的集合要困难得多(尽管您可以通过punt进入
子进程调用(['sort',stdin=file1,stdout=tmpfile]
on*nix),并行迭代比集合交集要复杂得多,我甚至不确定当你最终让它工作时,它是否会有更高的效率,或者性能一开始就是个问题。
>>> import dset
>>> with open('file1') as f1, open('file2') as f2:
...     matches = dset.DiskSet(f1).intersection(f2)