как использовать zip.write() в каталогах, используя относительный путь в python?

#python #zipfile #bytesio #write

#python #zip #относительный путь #bytesio

Вопрос:

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

assets/images/logo.png

Когда на самом деле мне нужно, чтобы он включал:

 assets/
assets/images/
assets/images/logo.png
  

Итак, мой вопрос в том, как мне добавить каталоги в виде явных записей, используя относительные пути? Я пытался использовать zip.write(relative/path/to/directory) , но он говорит, что не может найти каталог, поскольку это относительный путь. Это работает, когда я помещаю

/Users/i510118/Desktop/Engineering/kit-dev-portal-models/src/kit_devportal_models/static_data/static_extension/created_extnsn_version_update2/assets/images/logo.png

внутри zip-файла.write() , но мне нужно, чтобы это был просто относительный путь, который просто

assets/images/logo.png

возможно ли это?

Вот мой полный код

         buf = io.BytesIO()
    zipObj = zipfile.ZipFile(buf, "w")
    extension_folder = "created_extnsn_version_update2"
    with zipObj:
        # Iterate over all the files in directory
        for folderName, subfolders, filenames in os.walk(path_to_extension_directory):
            # If the folder is not the root folder the extension is in
            if not folderName.endswith(extension_folder):
                folder = folderName.split(f"{extension_folder}/", 1)[1]
            else:
                folder = ''
            for filename in filenames:
                # create complete filepath of file in directory
                filePath = os.path.relpath(os.path.join(folderName, filename), path_to_extension_directory)
                with open(f"{folderName}/{filename}", 'rb') as file_data:
                    bytes_content = file_data.read()
                    # Add folder to zip if its not the root directory
                    if folder:
                        zipObj.write(folder)
                    # Add file to zip
                    zipObj.writestr(filePath, bytes_content)
                    # edit zip file to have all permissions
                    zf = zipfile.ZipFile(buf, mode='a')
                    info = zipfile.ZipInfo(f"{folderName}/{filename}")
                    info.external_attr = 0o777 << 16
                    zf.writestr(info, f"{folderName}/{filename}")

    # Rewind the buffer's file pointer (may not be necessary)
    buf.seek(0)
    return buf.read()
  

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация!

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

1. Вы должны взглянуть на pathlib( docs.python.org/3/library/pathlib.html )

Ответ №1:

Из кода, украденного из добавить пустой каталог с помощью zipfile?

 import zipfile

zf = zipfile.ZipFile('test.zip', 'w')

folders = [
    "assets/",
    "assets/images/",
    ]

for n in folders:
    zfi = zipfile.ZipInfo(n)
    zf.writestr(zfi, '')

zf.write('logo.png', 'assets/images/logo.png')

zf.close()

zf = zipfile.ZipFile('test.zip', 'r')

for i in zf.infolist():
    print(f"is_dir: {i.is_dir()}; filename: {i.filename}")

zf.close()