获取两个文件的差异

Obtain the difference between two files

首先,我在网上和 Whosebug 上搜索了大约 3 天,但没有找到任何我一直在寻找的东西。

我每周进行一次安全审计,我会在其中取回一个包含 IP 和开放端口的 .csv 文件。它们看起来像这样:

20160929.csv

10.4.0.23;22
10.12.7.8;23
10.18.3.192;23

20161006.csv

10.4.0.23;22
10.18.3.192;23
10.24.0.2;22
10.75.1.0;23

区别在于: 10.12.7.8:23 已关闭。 10.24.0.2:2210.75.1.0:23 已打开。

我想要一个打印我的脚本:

[-] 10.12.7.8:23
[+] 10.24.0.2:22
[+] 10.75.1.0:23

我怎样才能制作这样的脚本? 我尝试了我的 difflib,但这不是我需要的。我还需要能够稍后将其写入文件或将该输出作为我已经有脚本的邮件发送。

我不会用Unix,因为在我们公司有一个Windows环境,不允许使用另一个OS。所以我不能使用 diff 或其他一些很棒的工具。

这是我的第一次尝试:

old = set((line.strip() for line in open('1.txt', 'r+')))
new = open('2.txt', 'r+')
diff = open('diff.txt', 'w')

for line in new:
    if line.strip() not in old:
        diff.write(line)
new.close()
diff.close()

这是我第二次尝试

old = set((line.strip() for line in open('1.txt', 'r+')))
new = open('2.txt', 'r+')
diff = open('diff.txt', 'w')

for line in new:
    if line.strip() not in old:
        diff.write(line)
new.close()
diff.close()

以您的代码为基础,您可以执行以下操作:

old = set((line.strip() for line in open('1.txt')))
new = set((line.strip() for line in open('2.txt')))

with open('diff.txt', 'w') as diff:
    for line in new:
        if line not in old:
            diff.write('[-] {}\n'.format(line))

    for line in old:
        if line not in new:
            diff.write('[+] {}\n'.format(line))

这里有一些调整:

  1. 我们要阅读旧的和新的单独的行 要比较的文件。
  2. 我们不必 strip 每一行,因为我们在读取文件时已经这样做了。
  3. 我们使用 {}.format() 来构建文本字符串。
  4. 使用 \n 确保我们将每个条目放在输出文件的新行上。
  5. 对我们正在写入的文件使用 with 让我们无需调用 close 即可打开它并且(如果我的知识是正确的)允许在文件崩溃后更好地处理任何程序已打开。

你可以试试这个:

old_f = open('1.txt')
new_f = open('2.txt')
diff = open('diff.txt', 'w')

old = [line.strip() for line in old_f]
new = [line.strip() for line in new_f]

for line in old:
    if line not in new:
        print '[-] ' + str(line)
        diff.write('[-] ' + str(line) + '\n'


for line in new:
    if line not in old:
        print '[+]' + str(line)
        diff.write('[+] ' + str(line) + '\n'

old_f.close()
new_f.close()
diff.close()

在下面的解决方案中,我使用了集合,所以顺序无关紧要,我们可以直接用旧的和新的相减,看看有什么变化。

我还使用了 with 上下文管理器模式来打开文件,这是确保它们再次关闭的巧妙方法。

def read_items(filename):
    with open(filename) as fh:
        return {line.strip() for line in fh}

def diff_string(old, new):
    return "\n".join(
        ['[-] %s' % gone for gone in old - new] +
        ['[+] %s' % added for added in new - old]
    )

with open('diff.txt', 'w') as fh:
    fh.write(diff_string(read_items('1.txt'), read_items('2.txt')))

显然,如果需要,您可以打印出差异字符串。