Python/zip: Как устранить абсолютный путь в zip-архиве, если предоставлены абсолютные пути для файлов?
У меня есть два файла в двух разных каталогах, один - '/home/test/first/first.pdf'
, другой - '/home/text/second/second.pdf'
. Я использую следующий код для их сжатия:
import zipfile, StringIO
buffer = StringIO.StringIO()
first_path = '/home/test/first/first.pdf'
second_path = '/home/text/second/second.pdf'
zip = zipfile.ZipFile(buffer, 'w')
zip.write(first_path)
zip.write(second_path)
zip.close()
После того, как я открою созданный zip файл, у меня есть папка home
, тогда в нем есть две подпапки, first
и second
, а затем файлы PDF. Я не знаю, как включить только два файла PDF вместо полного пути, заархивированного в zip-архив. Надеюсь, я разъясню свой вопрос, пожалуйста, помогите. Спасибо.
Ответы
Ответ 1
Метод zipfile write() поддерживает дополнительный аргумент (arcname), который является именем архива, который будет храниться в zip файле, поэтому вам нужно будет только изменить код:
from os.path import basename
...
zip.write(first_path, basename(first_path))
zip.write(second_path, basename(second_path))
zip.close()
Если у вас есть свободное время, прочитайте документацию для zipfile.
Ответ 2
Я использую эту функцию для zip каталога без включения абсолютного пути
import zipfile
import os
def zipDir(dirPath, zipPath):
zipf = zipfile.ZipFile(zipPath , mode='w')
lenDirPath = len(dirPath)
for root, _ , files in os.walk(dirPath):
for file in files:
filePath = os.path.join(root, file)
zipf.write(filePath , filePath[lenDirPath :] )
zipf.close()
#end zipDir
Ответ 3
Я подозреваю, что может быть более элегантное решение, но это должно работать:
def add_zip_flat(zip, filename):
dir, base_filename = os.path.split(filename)
os.chdir(dir)
zip.write(base_filename)
zip = zipfile.ZipFile(buffer, 'w')
add_zip_flat(zip, first_path)
add_zip_flat(zip, second_path)
zip.close()
Ответ 4
Это также может быть сделано (это позволяет создавать архивы> 2 ГБ)
import os, zipfile
def zipdir(path, ziph):
"""zipper"""
for root, _, files in os.walk(path):
for file_found in files:
abs_path = root+'/'+file_found
ziph.write(abs_path, file_found)
zipf = zipfile.ZipFile(DEST_FILE.zip, 'w', zipfile.ZIP_DEFLATED, allowZip64=True)
zipdir(SOURCE_DIR, zipf)
zipf.close()