比较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.txt
和sample.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个文件并打印不匹配的文本的主要内容,如果未能解决你的问题,请参考以下文章