Как заархивировать папки с подпапками, содержащими файлы .yml, с помощью Python

У меня есть папка «a», в которой есть подпапки «b» и подпапки «c», содержащие файлы .yml. Я хочу заархивировать все файлы .yml в подпапках «b» или «c» без вложенной структуры папок, чтобы .zip содержал все файлы .yml. Ниже приведен код Python, который у меня есть на данный момент. Он не сжимает все файлы .yml в подпапках.

import os
from zipfile import ZipFile

# # Adding files that need to be zipped
directory_to_zip = r'filepath'

# Create a ZipFile Object
with ZipFile(r'filepath\helper.zip', 'w') as zip_object:
    # Traverse the directory and add YAML files to the zip
    for root, dirs, files in os.walk(directory_to_zip):
        for file in files:
            if file.endswith('.yml'):
                # Create the complete filepath
                file_path = os.path.join(root, file)
                # Write the file to the zip file with just the filename, ignoring directories
                zip_object.write(file_path, file)

# Check to see if the zip file is created
if os.path.exists(r'filepath\helper.zip'):
    print("ZIP file created")
else:
    print("ZIP file not created")

Не могли бы вы уточнить, какие именно файлы не добавляются в zip-файл? Есть ли определенная закономерность среди пропущенных файлов?

M-Sarabi 23.08.2024 06:25

Вам необходимо объяснить в вопросе, что именно вы подразумеваете под «Это не сжатие всех файлов .yml в подпапках», с примером. Насколько я могу судить, ваш сценарий работает отлично.

Mark Adler 23.08.2024 06:37

@MarkAdler Когда я говорю «он не сжимает все файлы .yml», я имел в виду, что в основной папке «a» есть несколько уникальных подпапок, а под подпапкой снова есть уникальная подпапка с уникальными файлами .yml. Итак, мой код .py не переносит все файлы .yml из всех подпапок в файл .zip.

testenthu 23.08.2024 07:27

У меня это работает, независимо от того, насколько глубоко расположены файлы .yml. Приведите явный пример того, что это не работает в вопросе. Это означает отображение точного набора имен каталогов и имен файлов, определение того, какие файлы архивируются, а какие нет. (Не в комментариях — отредактируйте вопрос.)

Mark Adler 23.08.2024 07:40

@MarkAdler Я пока не могу редактировать свой вопрос по какой-то причине, он мне этого не позволяет.

testenthu 23.08.2024 08: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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Когда вы добавляете файлы в zip-архив с помощью zip_object.write(file_path, file), файлы сохраняются непосредственно в корне zip-архива. Если несколько файлов имеют одинаковое имя config.yml в разных подпапках, они перезапишут друг друга.

# Path to the directory you want to zip
directory_to_zip = r'filepath\a'

# Path where you want to save the zip file
zip_file_path = r'filepath\helper.zip'

# Create a ZipFile Object
with ZipFile(zip_file_path, 'w') as zip_object:
    # Traverse the directory and add YAML files to the zip
    for root, dirs, files in os.walk(directory_to_zip):
        for file in files:
            if file.endswith('.yml'):
                # Create the complete filepath
                file_path = os.path.join(root, file)
                
                # Option 1: If you want to keep the filenames unique by adding the parent directory's name
                archive_name = os.path.join(os.path.basename(root), file)
                
                # Option 2: If you're okay with just the filenames and are sure there are no conflicts
                # archive_name = file

                # Write the file to the zip file with the adjusted filename
                zip_object.write(file_path, archive_name)

# Check to see if the zip file is created
if os.path.exists(zip_file_path):
    print("ZIP file created")
else:
    print("ZIP file not created")

Это должно остановить потенциальные конфликты в именах файлов, включая имя родительского каталога. Код также должен гарантировать, что ваши .yml файлы включены в zip-файл без их вложения.

Обновлено: В этом ответе была опубликована неверная информация. Правильную информацию предоставил Марк Адлер, который пояснил: «Вы ошибаетесь. Файлы с точно такими же именами можно добавить в zip-файл. Python выдаст предупреждение, но все равно продолжит добавлять файл».

Я хочу использовать второй вариант, описанный выше, но он сжимает только некоторые файлы .yml, но не все. Я думаю, это из-за структуры папок, которая у меня есть, структура папок вложена, поэтому в основном это похоже на a->subfolder1->subfolder1.1->.yml , a->subfolder2->subfolder.2.1->.yml и так далее. .....

testenthu 23.08.2024 06:18

можете ли вы перезагрузить среду и повторить попытку?

lvand 23.08.2024 06:21

Насколько мне известно, ZIP-файлы могут содержать файлы с одинаковыми именами, поскольку они отслеживаются по индексу или аналогичному механизму, а не по имени файла. Поэтому я не уверен, что это проблема. Кроме того, я протестировал исходный скрипт, и он у меня работал корректно, даже если файлы .yml имели одно и то же имя в разных каталогах.

M-Sarabi 23.08.2024 06:22

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

lvand 23.08.2024 06:25

@lvand Вы не правы. В zip-файл можно добавить файлы с точно таким же именем. Python выдаст предупреждение, но все равно продолжит добавление файла.

Mark Adler 23.08.2024 06:35

@Иван, твой код работал нормально, извини, я только что понял, что есть несколько файлов с .yaml и несколько файлов с .yml.

testenthu 23.08.2024 08:25

Мои извинения @Марк Адлер, я отредактирую свой ответ, когда буду дома.

lvand 23.08.2024 09:20

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