У меня есть структура каталогов, которая похожа на /level1/level2/level3/level4/level5
и на уровне5 у меня есть.json файлы, которые я хочу заменить с помощью zipped-up версий, начиная с /level1/level2/level3/level4/level5/{file1.json, file2.json, file3.json}
to /level1/level2/level3/level4/level5/{file1.zip, file2.zip, file3.zip}
Однако мой код генерирует zip файлы в папке, где находится скрипт, который является уровнем 3, в результате чего /level1/level2/[level3]{file1.zip, file2.zip, file3.zip}/level4/level5/{file1.json, file2.json, file3.json}
Кроме того, если я разархивирую файл, я получаю всю структуру каталогов, а не только файл. Например, если я unzip file1.zip, я получаю /level1/level2/[level3]{(/level1/level2/level3/level4/level5/file1.json), file2.zip, file3.zip}/level4/level5/{file1.json, file2.json, file3.json}
Я пробовал разные аргументы, но я не уверен, как получить результат, который я хочу. Как я могу это сделать?
Это мой код в настоящее время
path = os.path.join(
os.path.dirname(os.path.abspath(__file__)),
level4, level5)
for root, dirs, files in os.walk(path, topdown=True):
print('This is root: ', root)
for file in files:
zf = zipfile.ZipFile(
'{}.zip'.format(file[:-5]), 'w',
zipfile.ZIP_DEFLATED)
zf.write(os.path.join(root, file))
zf.close()
Вы должны создать zip файл с соединенным корневым путем таким образом, чтобы zip файл был создан там, где находится файл JSON, а при записи JSON файла в zip файл вместо метода write
используйте метод writestr
чтобы вы могли назвать файл с указанием имени пути, которое в этом случае является просто именем файла без имени пути вообще:
for root, dirs, files in os.walk(path, topdown=True):
print('This is root: ', root)
for file in files:
zf = zipfile.ZipFile(os.path.join(root, '{}.zip'.format(file[:-5])), 'w', zipfile.ZIP_DEFLATED)
zf.writestr(file, open(os.path.join(root, file)).read())
zf.close()