У меня есть папка «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")
Вам необходимо объяснить в вопросе, что именно вы подразумеваете под «Это не сжатие всех файлов .yml в подпапках», с примером. Насколько я могу судить, ваш сценарий работает отлично.
@MarkAdler Когда я говорю «он не сжимает все файлы .yml», я имел в виду, что в основной папке «a» есть несколько уникальных подпапок, а под подпапкой снова есть уникальная подпапка с уникальными файлами .yml. Итак, мой код .py не переносит все файлы .yml из всех подпапок в файл .zip.
У меня это работает, независимо от того, насколько глубоко расположены файлы .yml. Приведите явный пример того, что это не работает в вопросе. Это означает отображение точного набора имен каталогов и имен файлов, определение того, какие файлы архивируются, а какие нет. (Не в комментариях — отредактируйте вопрос.)
@MarkAdler Я пока не могу редактировать свой вопрос по какой-то причине, он мне этого не позволяет.
Когда вы добавляете файлы в 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 и так далее. .....
можете ли вы перезагрузить среду и повторить попытку?
Насколько мне известно, ZIP-файлы могут содержать файлы с одинаковыми именами, поскольку они отслеживаются по индексу или аналогичному механизму, а не по имени файла. Поэтому я не уверен, что это проблема. Кроме того, я протестировал исходный скрипт, и он у меня работал корректно, даже если файлы .yml
имели одно и то же имя в разных каталогах.
Действительно, это верно при условии, что они хранятся в разных каталогах архива. Проблема заключалась в том, что файлы перезаписывали друг друга, если вы явно указали одно и то же имя в zip-архиве для нескольких файлов независимо от их структуры каталогов.
@lvand Вы не правы. В zip-файл можно добавить файлы с точно таким же именем. Python выдаст предупреждение, но все равно продолжит добавление файла.
@Иван, твой код работал нормально, извини, я только что понял, что есть несколько файлов с .yaml и несколько файлов с .yml.
Мои извинения @Марк Адлер, я отредактирую свой ответ, когда буду дома.
Не могли бы вы уточнить, какие именно файлы не добавляются в zip-файл? Есть ли определенная закономерность среди пропущенных файлов?