比较python中的2个文件并打印不匹配的文本

Posted

技术标签:

【中文标题】比较python中的2个文件并打印不匹配的文本【英文标题】:Compare 2 files in python and print non-matching text 【发布时间】:2017-10-29 11:06:13 【问题描述】:

我有两个文件:

Resp.txt:
vrf XXX
 address-family ipv4 unicast
  import route-target
   123:45
   212:43
  !
  export route-policy ABCDE
  export route-target
   9:43
  !
  maximum prefix 12 34
  spanning tree enable
  bandwidth 10
 !
!

和sample.txt

vrf
address-family ipv4 unicast
import route-target
export route-target
maximum prefix

我想匹配resp.txtsample.txt,这样如果样本内容不存在于相应的位置,我就会得到这些文本行。输出应该是这样的:

spanning tree enable
bandwidth 10

我正在使用:

t2=open('sample.txt','r')
abc=open('resp.txt','r')
for x in t2:
  for line in abc:

         if x.strip() in line.strip():
          print 'yes'
         else:
          print line

但它匹配两个文本文件中的每一行,因此没有显示正确的结果。

【问题讨论】:

什么是resp?请注意,您只能对文件句柄进行一次迭代,因此只有在 t2 上的循环的第一次迭代才会真正执行任何操作。 @jonrsharpe resp 是我必须匹配的文件。有没有其他方法可以实现我的输出? strip() 是空的,所以没用,你想跳过空格吗?然后使用 strip(' ') @Ale,我可以匹配但没有得到想要的输出。 @jonrsharpe resp.txt 是我的文件,我正在使用 resp[1] 读取它。 【参考方案1】:

因此,获取所有不在sample.txt 中的字符串的最简单解决方案是使用集合差异:

file_1 = set()
file_2 = set()

with open('Resp.txt', 'r') as f:
    for line in f:
        file_1.add(line.strip())

with open('Sample.txt', 'r') as f:
    for line in f:
        file_2.add(line.strip())

print(file_1 - file_2)

返回:

'export route-policy ABCDE', 'vrf XXX', 'spanning tree enable', '!', '212:43', 'bandwidth 10', 'maximum prefix 12 34', '9:43', '123:45'

但是,这不包括应用于Resp.txt 的某些规则,例如:

如果行是“最大前缀”,则忽略数字。

这些规则可以在阅读Resp.txt时应用:

import re

file_1 = set()
file_2 = set()

with open('Resp.txt', 'r') as f:
    for line in f:
        line = line.strip()
        if line == "!":
            continue
        elif re.match( r'\d+:\d+', line): # Matches times.
            continue
        elif line.startswith("vrf"):
            line = "vrf"
        elif line.startswith("maximum prefix"):
            line = "maximum prefix"
        file_1.add(line)

with open('Sample.txt', 'r') as f:
    for line in f:
        file_2.add(line.strip())

print(file_1) - file_2)

返回:

'export route-policy ABCDE', 'bandwidth 10', 'spanning tree enable'

这是正确的,因为sample.txt 不包含route-policy

这些规则可以变得更加健壮,但它们应该具有足够的说明性。

请记住,set 只会发现独特的差异,而不是全部(假设您有多个 'spanning tree enable' 行并且想知道这些行被看到了多少次。在这种情况下,您可以做更多的事情使用您的原始代码:

import re

file_1 = []
file_2 = []

with open('Resp.txt', 'r') as f:
    for line in f:
        line = line.strip()
        if line == "!":
            continue
        elif re.match( r'\d+:\d+', line):
            continue
        elif line.startswith("vrf"):
            line = "vrf"
        elif line.startswith("maximum prefix"):
            line = "maximum prefix"
        file_1.append(line)

with open('Sample.txt', 'r') as f:
    for line in f:
        file_2.append(line.strip())

diff = []

for line in file_1:
    if line not in file_2:
        diff.append(line)

print(diff)

结果:

['export route-policy ABCDE', 'spanning tree enable', 'bandwidth 10']

虽然此方法速度较慢(尽管您可能不会注意到),但它可以找到重复的行并保持找到的行的顺序。

【讨论】:

以上是关于比较python中的2个文件并打印不匹配的文本的主要内容,如果未能解决你的问题,请参考以下文章

我需要比较python中的2个嵌套列表以查找第一个列表的字符串与第二个列表中的字符串不匹配的位置

比较2个字符串而不考虑Python中的重音[重复]

比较两个文件并包括匹配和不匹配记录

python如何查找两个文本文件之间的所有单词匹配

使用 awk 比较两个文件并打印不匹配的记录

匹配文件中的字符串并使用 sed 或 awk 打印整个值