2017-01-03 18 views
2

python zipfileモジュールを使用してフォルダ内のすべてのファイルを圧縮しようとしています(フォルダにはサブディレクトリがありません)。Python - zipfileモジュールを使用してディレクトリ内のすべてのファイルを圧縮

folderAは、F:\Projects\ProjectA\Folders\folderA and my script under F:\Projects\ProjectA\CodeA\zipcode.pyの下に座っています。結果のzipファイルのファイル名がfolderA.zipF:\Projects\ProjectA\Folders、元のファイル名になるように、folderAのすべてのファイルを圧縮します。

唯一の問題は、結果を解凍するとfolderAの代わりにFolders \ folderAが生成されることです。それは、scriptAのfolderAの相対パスと関係があるが、私は望む結果を得ることができない。あなたのループ内

#zipcode.py 
import os 
import zipfile 

filepath = "F:/Projects/ProjectA/Folders/folderA" 

archive = zipfile.ZipFile(os.path.abspath(filepath) + '.zip', 'w') 

for root, dirs, files in os.walk(filepath): 
     for afile in files: 
      archive.write(os.path.relpath(os.path.join(root, afile))) 
     archive.close() 

答えて

0

arcnameパラメータ使用して、アーカイブメンバーの名前変更:folderAパスを維持するために

archive.write(os.path.join(root, afile),arcname=name_in_archive) 

name_in_archive = os.path.join(os.path.basename(filepath),afile) 

を。

私はよく分かりませんが(pythonのバージョンによって異なります)、Windowsのバックスラッシュをスラッシュで置き換えて、.zipファイルを移植する必要があるかもしれません。悪くはない:私たちは、アーカイブ内のファイルの名前の完全な制御を持っているので、今必要としない私はos.path.relpath電話を落としている

archive.write(os.path.join(root, afile),arcname=name_in_archive.replace(os.sep,"/")) 

注意を。

アーカイブを開くときに絶対パスに変換する必要はありません。それは絶対的であれば、それは相対的なだけでなく、かどうopenは、ファイルを見つける:

archive = zipfile.ZipFile(os.path.abspath(filepath) + '.zip', 'w') 

はちょうど

archive = zipfile.ZipFile(filepath + '.zip', 'w') 
+0

を書くことができ、私は実際にすべてのファイルが常駐しているとfolderAという名前のフォルダが含まれているために、出力zipファイルが欲しいですその中に。上記のファイルはzipファイルに直接書き込まれます。 –

+0

@Riz_K:私の最初の答えは真ですが、私の編集は 'name_in_archive = os.path.join(os.path.basename(filepath)、afile)'を追加しました。これによりすべてのファイルに 'folderA'接頭辞が追加されます。重要な点は、アーカイブ内のファイルの名前を制御する方法を知っていることです。 –

+0

恐ろしい...詳細をありがとう! –

関連する問題