#python-3.x #zipfile
#python-3.x #zip
Вопрос:
Когда я пытаюсь заархивировать каталог с помощью следующего кода, мой каталог архивируется и содержит все файлы, которые я хотел бы заархивировать, однако он также архивирует корневые каталоги для каталога, который я хотел бы заархивировать.
(Тест — это целевой каталог, который нужно заархивировать — он содержит другие каталоги и файлы) При распаковке my_python_files.zip он распаковывается с абсолютными путями:
распаковка my_python_files.zip:
Users hhafez Desktop Test
когда я хотел бы иметь:
Test
У меня возникли проблемы при попытке найти способ избежать этого, любые советы были бы высоко оценены.
def get_all_file_paths(directory):
file_paths = []
for root, directories, files in os.walk(directory):
for filename in files:
filepath = os.path.join(root, filename)
file_paths.append(filepath)
return file_paths
def zipfiles():
file_paths = get_all_file_paths(r"C:UsershhafezDesktopTest")
with ZipFile('my_python_files.zip','w') as myzip:
for file in file_paths:
print(file)
myzip.write(file)
print('All files zipped successfully!')
zipfiles()
Ответ №1:
если вы хотите заархивировать список файлов и не хотите, чтобы zip-архив содержал абсолютные пути к каждому файлу…
def zipFiles(directory):
parentDir = "C:UsershhafezDesktop" #hardcoding parent path to strip
with ZipFile('my_python_files.zip','w') as myzip:
for root, directories, files in os.walk(directory):
zipFileName = root[len(parentDir):] #always take whats after the parentDir for the filename going in the zip
for file in files:
myzip.write(os.path.join(root,file), os.path.join(zipFileName,file), compress_type=zipfile.ZIP_DEFLATED)
zipfiles(r"C:UsershhafezDesktopTest")
Это должно выполнить то, что вам нужно. Основным отличием здесь является переменная zipFileName.
zipFileName = root[len(parentDir):]
Эта строка удаляет parentDir из каталога, по которому вы выполняете обход. zipFileName и имя файла будут именем архива для передачи в myzip.write, что объясняет это:
myzip.write(os.path.join(root,file), os.path.join(zipFileName,file), compress_type=zipfile.ZIP_DEFLATED)
Комментарии:
1. кажется, что basename удаляет все каталоги в моем целевом каталоге, я хотел бы оставить все нетронутым в целевом каталоге.
2. @HishamHafez удалил мою попытку с базовым именем и изменил мое решение в соответствии с вашим комментарием