#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()