比较两个文件报告python中的差异 [英] Compare two files report difference in python

查看:32
本文介绍了比较两个文件报告python中的差异的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有 2 个名为hosts"的文件(在不同的目录中)

I have 2 files called "hosts" (in different directories)

我想用 python 比较它们,看看它们是否相同.如果它们不相同,我想在屏幕上打印差异.

I want to compare them using python to see if they are IDENTICAL. If they are not Identical, I want to print the difference on the screen.

到目前为止我已经尝试过这个

So far I have tried this

hosts0 = open(dst1 + "/hosts","r") 
hosts1 = open(dst2 + "/hosts","r")

lines1 = hosts0.readlines()

for i,lines2 in enumerate(hosts1):
    if lines2 != lines1[i]:
        print "line ", i, " in hosts1 is different 
"
        print lines2
    else:
        print "same"

但是当我运行这个时,我得到

But when I run this, I get

File "./audit.py", line 34, in <module>
  if lines2 != lines1[i]:
IndexError: list index out of range

这意味着其中一台主机的线路比另一台多.有没有更好的方法来比较 2 个文件并报告差异?

Which means one of the hosts has more lines than the other. Is there a better method to compare 2 files and report the difference?

推荐答案

import difflib

lines1 = '''
dog
cat
bird
buffalo
gophers
hound
horse
'''.strip().splitlines()

lines2 = '''
cat
dog
bird
buffalo
gopher
horse
mouse
'''.strip().splitlines()

# Changes:
# swapped positions of cat and dog
# changed gophers to gopher
# removed hound
# added mouse

for line in difflib.unified_diff(lines1, lines2, fromfile='file1', tofile='file2', lineterm=''):
    print line

输出以下内容:

--- file1
+++ file2
@@ -1,7 +1,7 @@
+cat
 dog
-cat
 bird
 buffalo
-gophers
-hound
+gopher
 horse
+mouse

此差异为您提供上下文 -- 周围的行以帮助您清楚文件的不同之处.在这里你可以看到两次cat",因为它是从dog"下面移除并添加到它上面的.

This diff gives you context -- surrounding lines to help make it clear how the file is different. You can see "cat" here twice, because it was removed from below "dog" and added above it.

您可以使用 n=0 删除上下文.

You can use n=0 to remove the context.

for line in difflib.unified_diff(lines1, lines2, fromfile='file1', tofile='file2', lineterm='', n=0):
    print line

输出:

--- file1
+++ file2
@@ -0,0 +1 @@
+cat
@@ -2 +2,0 @@
-cat
@@ -5,2 +5 @@
-gophers
-hound
+gopher
@@ -7,0 +7 @@
+mouse

但是现在它充满了@@"行,告诉您文件中已更改的位置.让我们删除多余的行以使其更具可读性.

But now it's full of the "@@" lines telling you the position in the file that has changed. Let's remove the extra lines to make it more readable.

for line in difflib.unified_diff(lines1, lines2, fromfile='file1', tofile='file2', lineterm='', n=0):
    for prefix in ('---', '+++', '@@'):
        if line.startswith(prefix):
            break
    else:
        print line

给我们这个输出:

+cat
-cat
-gophers
-hound
+gopher
+mouse

现在你想让它做什么?如果您忽略所有已删除的行,则不会看到猎犬"已被删除.如果您很高兴只显示添加到文件中的内容,那么您可以这样做:

Now what do you want it to do? If you ignore all removed lines, then you won't see that "hound" was removed. If you're happy just showing the additions to the file, then you could do this:

diff = difflib.unified_diff(lines1, lines2, fromfile='file1', tofile='file2', lineterm='', n=0)
lines = list(diff)[2:]
added = [line[1:] for line in lines if line[0] == '+']
removed = [line[1:] for line in lines if line[0] == '-']

print 'additions:'
for line in added:
    print line
print
print 'additions, ignoring position'
for line in added:
    if line not in removed:
        print line

输出:

additions:
cat
gopher
mouse

additions, ignoring position:
gopher
mouse

现在您可能已经知道有多种方法可以打印出两个文件的差异",因此如果您需要更多帮助,则需要非常具体.

You can probably tell by now that there are various ways to "print the differences" of two files, so you will need to be very specific if you want more help.

这篇关于比较两个文件报告python中的差异的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆