python-比较文件A和文件B
我是python新手。我想创建一个脚本来比较两个文件,输出将包含匹配的文本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/
我想比较文件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
元素,并且只支持plusintersection
的最小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)