比较两个文件并打印不匹配的文本(使用 Python 实现)
比较两个文件并打印不匹配的文本(使用 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.txt
和 sample.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日
因此,获取不在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']
虽然这种方法较慢(尽管您可能不会注意到),但它可以找到重复的行并保持找到行的顺序。