Подтвердить что ты не робот

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-архив. Надеюсь, я разъясню свой вопрос, пожалуйста, помогите. Спасибо.

4b9b3361

Ответ 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()