web-dev-qa-db-ja.com

python / Zip:ファイルの絶対パスが提供されている場合、Zipアーカイブの絶対パスを削除する方法

2つの異なるディレクトリに2つのファイルがあります。1つは'/home/test/first/first.pdf'、もう1つは'/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フォルダーがあり、その中にfirstsecondの2つのサブフォルダーがあり、pdfファイル。完全なパスをZipアーカイブに圧縮するのではなく、2つのpdfファイルのみを含める方法がわかりません。私の質問を明確にしてください、助けてください。ありがとう。

50
Shang Wang

Zipfile write()メソッドは、Zipファイルに保存されるアーカイブ名である追加の引数(arcname)をサポートしているため、コードを変更する必要があるのは次のコマンドのみです。

from os.path import basename
...
Zip.write(first_path, basename(first_path))
Zip.write(second_path, basename(second_path))
Zip.close()

zipfile のドキュメントを読む余裕がある場合に役立ちます。

109
João Pinto

この関数を使用して、絶対パスを含めずにディレクトリを圧縮します

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
8
himnabil

もっとエレガントなソリューションがあるかもしれませんが、これはうまくいくはずです:

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()
5
shx2