比较两个文件并打印不匹配的文本(使用 Python 实现)

14 浏览
0 Comments

比较两个文件并打印不匹配的文本(使用 Python 实现)

我有两个文件:

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,如果 sample 的内容不在 resp 中出现,那么我就会得到那些文本行。输出应该如下:

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

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

admin 更改状态以发布 2023年5月22日
0
0 Comments

因此,获取不在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']

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

0