即使硬文件相等,filecmp也返回False

问题描述

我正在尝试使用filecmp在两个文件之间进行转换,问题是结果始终为"No,the files are NOT the same",这意味着False 即使文件相同。

我正在将两个相同内容文件写入。首先,我写入文件revision_1.txt

original_stdout = sys.stdout
with open('revision_1.txt','w') as rev1:
       sys.stdout = rev1
       print(revision)  # revision is output from command i took before
sys.stdout = original_stdout

if filecmp.cmp('revision_1.txt','revision_2.txt'):
    # revision_2.txt is file I c
    print("Both the files are same")
else:
    # Do whatever you want if the files are NOT the same
    print("No,the files are NOT the same")

original_stdout = sys.stdout
with open('revision_2.txt','w') as rev2:
       sys.stdout = rev2
       print(revision)  # revision is output from command i took before
sys.stdout = original_stdout

我的目标是文件是否相等-停止脚本。如果不是,它将重写revision_2.txt然后发送邮件(我已经为邮件编写了代码)。

解决方法

您对文件的使用情况异常:

import filecmp

revision = "08/15"

with open('revision_1.txt','w') as rev1:
      rev1.write(revision)

with open('revision_2.txt','w') as rev2:
      rev2.write(revision)

with open('revision_3.txt','w') as rev3:
      rev3.write(revision + "-42")

# should compare equal
if filecmp.cmp('revision_1.txt','revision_2.txt'):
    print("Identical")
else:
    print("No,the files are NOT the same")

# should NOT compare equal
if filecmp.cmp('revision_1.txt','revision_3.txt'):
    print("Identical")
else:
    print("No,the files are NOT the same")

打印

Identical
No,the files are NOT the same
,

尝试将shallow设置为false(默认为True),即

if filecmp.cmp('revision_1.txt','revision_2.txt',shallow=False):

从文档中: 如果shallow为true,则具有相同os.stat()签名的文件将被视为相等。否则,将比较文件的内容。

https://docs.python.org/3/library/filecmp.html#filecmp.cmp

,

谢谢大家的答复 正如我所说的,我对Python很陌生 根据您的建议,我更改了代码,这次我将发送完整的脚本并进行解释

我成功地在“修订”和“ d”之间进行了比较,我的问题是我得到了不同的rpc-reply message-id,

如何才能忽略message-id(我只需要Revision值)?

查看脚本输出: 不相等 修订:fpc1-1603878922-228

FFFFFFF 修订:fpc1-1603878922-228

FFFFFFF

脚本:

import smtplib
import email.message
from email.mime.text import MIMEText
from ncclient import manager
from ncclient.xml_ import *
import sys
import time
import filecmp

# Connecting to juniper cc-vc-leg
conn = manager.connect(
        host='10.1.1.1',port='830',username='test',password='test',timeout=10,device_params={'name':'junos'},hostkey_verify=False)

# Take juniper commands
resault = conn.command('show version | match Hostname',format='text')
revision = conn.command('show system commit revision',format='text')
compare_config = conn.compare_configuration(rollback=1)

# Open & read file vc-lg_rev.text
f = open('vc-lg_rev.text','r')
d = f.read()

# Check if revision output is equal to file "vc-lg_rev.text"
# If equal exit the script
if  (revision == d):
       print('equal')
       exit()
       print('I hop script stopped')
else:
       print('Not equal')
       print(revision)
       print('FFFFFFF')
       print(d)
       print('FFFFFFF')

# To save last revision number to "vc-lg_rev.text"
with open('vc-lg_rev.text','w',buffering=1) as rev1:
        rev1.write(str(revision))
        rev1.flush()
rev1.close()


# This is how i copy "compare_config" output to file "vc-lg_compare.text"
original_stdout = sys.stdout
with open('vc-lg_compare.text','w') as a:
        sys.stdout = a
        print(compare_config)
sys.stdout = original_stdout

def send_email(compare):
    server = smtplib.SMTP('techunix.technion.ac.il',25)
    email_reciver = 'rafish@technion.ac.il','rafi1shemesh@gmail.com'
    message = f"'Subject': mail_subject \n\n {compare}"
    ID = 'Juniper_Compare'
    server.sendmail(ID,email_reciver,message)

with open('vc-lg_compare.text','r') as compare:   # "as" means file object called compare
        text = str(compare.read())                 # I want to recive the output as string to look specific word in the file
        if (text.find('+') > -1) or (text.find('- ') > -1):
                send_email(text)