Проблема с печатью файлов, которые разные в двух папках

import os

def compare_files(file1, file2):
    # Function to compare files
    pass

def compare_folders(folder1, folder2):
    differences_found = False
    
    # Compare files in folder1
    for root, dirs, files in os.walk(folder1):
        for file in files:
            file1 = os.path.join(root, file)
            file2 = os.path.join(root.replace(folder1, folder2, 1), file)
            if not os.path.exists(file2):
                print(f"File {file} exists in {folder1} but not in {folder2}")
                differences_found = True
            elif os.path.isfile(file2):
                # If the file exists in both folders, compare them
                compare_files(file1, file2)
    
    # Compare files in folder2
    for root, dirs, files in os.walk(folder2):
        for file in files:
            file1 = os.path.join(root.replace(folder2, folder1, 1), file)
            file2 = os.path.join(root, file)
            if not os.path.exists(file1):
                print(f"File {file} exists in {folder2} but not in {folder1}")
                differences_found = True

    if not differences_found:
        print("No differences found between the files in the two folders.")

if __name__ == "__main__":
    folder1 = input("Enter path to the first folder: ")
    folder2 = input("Enter path to the second folder: ")
    
    compare_folders(folder1, folder2)

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

Каков именно ваш вопрос? Возможно, вы захотите отредактировать свой пост для большей ясности.

PM 77-1 18.03.2024 17:13

Привет. Я пытаюсь сравнить файлы в двух папках. Но мой сценарий не печатает все файлы, которые отличаются. Например, у меня есть 8 файлов. 6 одинаковы в обеих папках. У меня есть 2 файла в папке 1 и еще 2 в папке 1, но вместо этого pf показывает мне все разные файлы, он показывает по одному имени файла для каждой папки, которая отличается. Другие файлы с другим именем @ не читаются — PM 77-1

code space 18.03.2024 17:42

Как я предложил, отредактируйте свой вопрос и включите туда описание проблемы.

PM 77-1 18.03.2024 18:01
Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Есть несколько проблем с кодом:

  1. compare_files в настоящее время не проводит никаких сравнений. Сначала следует сравнить два входных файла на предмет размера и только затем проверить, одинаково ли их содержимое. Он должен возвращать True или False в зависимости от того, равны ли файлы при сравнении, и это возвращаемое значение следует использовать для установки differences_found.
  2. Если вы обнаружите разницу между двумя файлами или если файл существует в одном каталоге, но отсутствует в другом, в выдаваемом вами сообщении не отображаются полные пути к файлам; вы выводите только имена корневых папок.
  3. У вас есть:
def compare_folders(folder1, folder2):
    differences_found = False
    
    # Compare files in folder1
    for root, dirs, files in os.walk(folder1):
        for file in files:
            file1 = os.path.join(root, file)
            file2 = os.path.join(root.replace(folder1, folder2, 1), file)
            if not os.path.exists(file2):
                print(f"File {file} exists in {folder1} but not in {folder2}")
                differences_found = True
            elif os.path.isfile(file2):
                # If the file exists in both folders, compare them
                compare_files(file1, file2)
...

Я считаю, что это должно быть:

def compare_folders(folder1, folder2):
    differences_found = False

    # Compare files in folder1
    for root1, dirs, files in os.walk(folder1):
        for file in files:
            file1 = os.path.join(root1, file)
            root2 = root1.replace(folder1, folder2, 1)
            file2 = os.path.join(root2, file)
            if not os.path.isfile(file2):
                print(f"File {file} exists in {root1} but not in {root2}")
                differences_found = True
            else:
                # If the file exists in both folders, compare them
                if not compare_files(file1, file2):
                    print(f"Files {file} differ in {root1} and {root2}")
                    differences_found = True
...

Это не только распечатывает полные пути к файлам, начиная с исходных папок, но и исправляет небольшую ошибку: что, если у нас есть файлfolder1/a/b/test, но папка2/a/b/test существует, но вместо этого это каталог файла. Ваш текущий файл не будет показывать, что файл test существует в одном каталоге, но не в другом, и не будет установлен флаг differences_found.

Я предоставил реализацию compare_files в полном коде ниже:

import os
import mmap

def compare_files(file1: str, file2: str) -> bool:
    """Function to compare files."""

    with open(file1, 'rb') as f1, open(file2, 'rb') as f2:
        size1 = f1.seek(0, 2)
        size2 = f2.seek(0, 2)
        if size1 != size2:
            return False
        if size1 == 0:
            return True

        with mmap.mmap(f1.fileno(), 0, access=mmap.ACCESS_READ) as mm1, \
        mmap.mmap(f2.fileno(), 0, access=mmap.ACCESS_READ) as mm2:
            return mm1[0:] == mm2[0:]

def compare_folders(folder1: str, folder2: str) -> None:
    differences_found = False

    # Compare files in folder1
    for root1, dirs, files in os.walk(folder1):
        for file in files:
            file1 = os.path.join(root1, file)
            root2 = root1.replace(folder1, folder2, 1)
            file2 = os.path.join(root2, file)
            if not os.path.isfile(file2):
                print(f"File {file} exists in {root1} but not in {root2}")
                differences_found = True
            else:
                # If the file exists in both folders, compare them
                if not compare_files(file1, file2):
                    print(f"Files {file} differ in {root1} and {root2}")
                    differences_found = True

    # Compare files in folder2
    for root2, dirs, files in os.walk(folder2):
        for file in files:
            root1 = root2.replace(folder2, folder1, 1)
            file1 = os.path.join(root1, file)
            file2 = os.path.join(root2, file)
            if not os.path.isfile(file1):
                print(f"File {file} exists in {root2} but not in {root1}")
                differences_found = True

    if not differences_found:
        print("No differences found between the files in the two folders.")

if __name__ == "__main__":
    folder1 = input("Enter path to the first folder: ")
    folder2 = input("Enter path to the second folder: ")

    compare_folders(folder1, folder2)

Приведенный выше код работает для меня, поэтому, если у вас все еще возникают трудности, вам нужно явно показать минимальные структуры каталогов, которые не дают ожидаемых результатов, а также то, каков ваш ожидаемый результат и что вы на самом деле отображаете.

Спасибо! Но все равно не отображаются все файлы, которые я добавил в папку 1 и папку 2. например, в папке 1 есть файлы test.txt и test1.txt, а в папке 2 — test3.txt. Но вывод, напечатанный как test.txt, находится в папке 1, а не в папке floder2. О других файлах речи не шло.

code space 18.03.2024 19:50

Я хочу, чтобы сценарий прошел через папку 1 и папку 2. Распечатайте любые различия, например любые дополнительные файлы, которых нет в другом каталоге. Также, если файлы с одинаковыми именами находятся в двух каталогах, если они имеют различия, распечатайте содержимое, которое отличается.

code space 18.03.2024 19:55

Вы сказали, например, что в папке 1 есть файлы test.txt и test1.txt, а в папке 2 — test3.txt. Но вывод, напечатанный как test.txt, находится в папке 1, а не в папке floder2. Совершенно верно: test.txt нет в папке 2, в которой есть только test3.txt, как вы только что написали. Вы хотите сказать, что он также должен был указать, что test1.txt отсутствует в папке 2, но этого не произошло?

Booboo 18.03.2024 20:37

Все работает нормально. Он может печатать файлы, которых нет в другом каталоге или папке. Кроме того, он распечатывает имена файлов, которые имеют разное содержимое с тем же именем файла в другой папке. Теперь я пытаюсь распечатать содержимое, которое в обеих папках разное. Есть какие-нибудь советы по этому поводу?

code space 18.03.2024 23:19

Я не уверен, о чем вы спрашиваете. Что вы подразумеваете под «распечатать содержимое»? Вы имеете в виду построчный отчет о различиях?

Booboo 19.03.2024 00:41

Привет @Booboo да, я хочу, чтобы сценарий читался построчно и выдавал выходные данные, которые были добавлены в файлы папки 2, которые также присутствуют в папке 1, но содержимое другое. Я хочу, чтобы он печатал только разницу, а не все.

code space 19.03.2024 00:52

Теперь это новое требование. В Linux есть утилита diff, которая выполняет построчное сравнение. На других платформах вы можете загрузить общедоступные версии diff. Затем необходимо вызвать утилиту, указав пути к сравниваемым файлам. Для этого посмотрите subprocess.Popen. Затем, если у вас возникнут трудности с запуском этого вопроса, опубликуйте новый вопрос со своей попыткой (вы можете оставить здесь комментарий со ссылкой на новый вопрос, и я постараюсь его рассмотреть). На данный момент, если я решил вашу первоначальную проблему, рассмотрите возможность принятия моего ответа.

Booboo 19.03.2024 01:14

да, вы решили мой первоначальный вопрос. Спасибо

code space 19.03.2024 01:16

Не благодари меня. Вместо этого примите ответ. Посмотрите ссылку, которую я дал в предыдущем комментарии.

Booboo 19.03.2024 01:17

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