Как сравнить содержимое файлов в Python?

Пока это мой код. Я пытаюсь сравнить файлы, предоставленные пользователем, и распечатать, если содержимое обоих файлов одинаково. Если это то же строковое содержимое, которое я хотел бы напечатать Yes, если нет, напечатать No вместе со словами внутри обоих файлов.

print ('Enter the first file name: ', end = '')
FIRST_FILE = input()

print ('Enter the second file name: ', end = '')
SECOND_FILE = input()

if SECOND_FILE == line in FIRST_FILE:
    print('Yes')
else:
    print('No')

infile = open('one.txt', 'w')
infile.write('Hello') 
infile.close() 

infile2 = open('SameAsone.txt', 'w')
infile2.write('Hello') 
infile2.close()

infile3 = open('DifferentFromone.txt', 'w')
infile3.write('Bye') 
infile3.close() 

Спасибо.

Вы сравниваете строковое содержимое файлов (текст за текстом), «ID» файлов или байтовое содержимое файлов?

anon 23.02.2019 06:39

Содержимое строки. Извините, что не разъяснил.

Nanor 23.02.2019 06:40
SECOND_FILE и FIRST_FILE это строка, почему вы пишете line in SECOND_FILE? И каковы намерения следующих трех блоков для записи файла?
pwxcoo 23.02.2019 06:43

Это я просто пробую. я точно не знаю как это сделать

Nanor 23.02.2019 06:46

Этот вопрос может быть дубликатом stackoverflow.com/questions/21747112/…

anon 23.02.2019 06:53
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
1 553
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Вы можете добиться этого более эффективно, используя метод Прилавок модуля коллекций, а OrderedDict сохраняет порядок строк.

from collections import Counter, OrderedDict

with open("one.txt") as file_one, open("two.txt") as file_two:
    if OrderedDict(Counter(file_one)) == OrderedDict(Counter(file_two)):
        print("matched")
    else:
        print("not macthed")

Обратите внимание, что это просто покажет, содержат ли оба файла одинаковые строки, но не обязательно в идентичном порядке.

jamesdlin 23.02.2019 06:49

@jamesdlin Я думал, что он просто хочет сравнить два файла.

HariHaraSudhan 23.02.2019 07:00

Считаете ли вы, что один файл, содержащий foo\nbar\n, совпадает с другим файлом, содержащим bar\nfoo\n?

jamesdlin 23.02.2019 07:12

@jamesdlin понял. спасибо, я обновил ответ, надеюсь, это поможет

HariHaraSudhan 23.02.2019 07:35

Простой подход состоит в том, чтобы прочитать оба файла, используя f.read(), где f — это файл, открываемый в режиме чтения ('r'). Операция read() возвращает строковое содержимое файлов.

Затем мы сравниваем прочитанное содержимое файлов, используя ==, чтобы определить, идентичны ли последовательности строк.

Пусть fileA, fileB будут существующими именами файлов. Следовательно, минимальный код сравнения файлов должен быть:

  f = open(fileA, 'r')
  contentA = f.read()
  f.close()
  f = open(fileB, 'r')
  contentB = f.read()
  f.close()

  result = "No"
  if contentA == contentB:
    result = "Yes"

Вы также должны обрабатывать случаи, когда один из файлов отсутствует (минимальный код возвращает трассировку, если любой из fileA, fileB ссылается на несуществующий файл.

Ответ принят как подходящий

Простым подходом было бы использование filecmp

import filecmp
check = filecmp.cmp('file1.txt', 'file1.txt')
print ('No', 'Yes')[check]

Если вам нужна дополнительная информация, см. документы

Мне нравится этот ответ! Спасибо, что напомнили мне о filecmp, также вы могли бы сделать: print ('No', 'Yes')[check] вместо if: else:, просто чтобы поставить его там

Jab 23.02.2019 06:51

Отредактировано! Спасибо за понимание @Jab

skaul05 23.02.2019 07:00

Спасибо, это помогло. Теперь, как мне напечатать строки в обоих файлах под «Нет»?

Nanor 23.02.2019 07:16

@ skaul05 Нет проблем, я должен любить логическое индексирование

Jab 23.02.2019 07:16

@Nanor взгляните на difflib в конкретном Differ.compare. Также это может быть отдельным вопросом после некоторых исследований.

Jab 23.02.2019 07:20

Похоже, это не работает, если файл file1.txt изменяется во время выполнения.

alper 01.10.2021 13:58

Вы можете использовать .read, также я предлагаю использовать оператор with, так как нет необходимости закрывать файлы вручную.

def compare_files(fn1, fn2):
    with open(fn1, 'r') as file1, open(fn2, 'r') as file2:
        return file1.read() == file2.read()


first_file = input('Enter the first file name: ')
second_file = input('Enter the second file name: ')

print(['No', 'Yes'][compare_files(first_file, second_file)])

Другие вопросы по теме