filecmp возвращает False, даже если файлы равны

#python #file-comparison

#python #сравнение файлов

Вопрос:

Я пытаюсь сравнить два файла с filecmp , проблема в том, что результат всегда "No, the files are NOT the same" , что означает False , даже если файлы одинаковы.

Я записываю в два разных файла одно и то же содержимое. Сначала я записываю в file 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 , а затем отправит почту (я уже написал код для mail).

Комментарии:

1. Почему вы sys.stdout так много манипулируете? Почему бы просто не сделать file.write(...) ?

Ответ №1:

Ваше использование файлов для нас необычно:

 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
  

Комментарии:

1. Как можно игнорировать message-id (мне нужно только значение ревизии)?

2. ` Не равно <rpc-reply message-id=»urn:uuid:61dfe2cc-cf0a-40ad-855d-b28392ac151c»> <output> Редакция: fpc1-1603878922-228 </output> </rpc-reply> FFFFFFF: 0694a78b-23ab-4fe7-865f-b7f164e0dad9″> <вывод> Редакция: fpc1-1603878922-228 </output> </rpc-reply> FFFFFFF `

Ответ №2:

Попробуйте установить значение 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

Комментарии:

1. Это может помочь добавить небольшое объяснение того, что должен делать этот аргумент

Ответ №3:

Спасибо всем за ответ, как я уже сказал, я новичок в Python, В соответствии с вашими рекомендациями я изменил код, на этот раз я собираюсь отправить полный сценарий и объяснить

Я успешно сравниваю ‘revision’ и ‘d’, моя проблема в том, что я получаю другое rpc-ответное сообщение-id,

Как можно игнорировать message-id (мне нужно только значение ревизии)?

Смотрите Вывод скрипта: не равный Пересмотр: 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 amp; 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 nn {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)