これはなに?
フォルダをzip化するときにディレクトリ情報を含みたくない時が時々あり、いつもはzip -jで対応していたのですが、zipコマンドが使えない環境だったのでPythonで実装しました。
やること
通常普通にzipコマンド等でzipファイルを作成するとディレクトリを保持した状態でzipファイルが作成されます。
ただ、この状態だとAWS LambdaやGoogle Cloud Functionなどで利用するzipファイルでは解凍後のディレクトリ階層が想定より一段深くなりエラーとなります。そのため、図の下にあるようなディレクトリを保持しないようにzipを作成する必要があります。
zipコマンドが利用できる環境であれば、 zip -j で階層を保持しないzipファイルが作成できるのですが、それをPythonを利用して実施してみました。

ソースコード
処理
- 指定したパス直下のフォルダ、ファイル一覧取得
- フォルダの場合は、フォルダ内のファイルをZIP化
※ 指定したパス直下にファイルがある場合、ファイルはスキップ
import os
import shutil
import zipfile
path = "./sample/" # ZIP化したいフォルダの親パス
folders = os.listdir(path)
folders
for foldername in folders:
# フォルダの場合のみZIP化
if os.path.isdir(path + foldername):
for dirname, subdirs, filenames in os.walk(path+'/'+foldername):
zp = zipfile.ZipFile(foldername+'.zip', 'w')
for fname in filenames:
zp.write(os.path.join(dirname, fname),arcname=fname)
zp.close()
print(foldername+'.zip')
動作確認
以下のような階層で、sampleフォルダを指定した場合
└─sample
│ test4.txt
│
├─dir1
│ test1.txt
│ test2.txt
│
└─dir2
test3.txt
下記画像のようにzipファイルが作成されます。

解凍するとフォルダ直下にファイルが作成されていることが確認できます。
