はじめに
パスワード付きzipファイルをpythonで扱う方法をまとめます。
機械学習などプログラムで扱いたいデータが外に出てはいけないものの場合、役に立つと思います。
今回は、ファイルとして出力せず、プログラムでファイルの内容のみ出力するコードを紹介します。ファイルとして出力したい方は参考文献に記載しているこちらが参考になると思います。
なお、圧縮ファイルの形式が選べる方は、7z形式を使うと高速だと思います。
全体像(zip version)
ソースコードはこちらです。
import zipfile
import getpass
p = getpass.getpass().encode()
zipFilePath = ".zip" # zipファイルのパスを指定して下さい
with zipfile.ZipFile(zipFilePath, "r") as zp:
fileNames = zp.namelist()
for fileName in fileNames:
try:
with zp.open(fileName, pwd=p) as f:
content = f.read().decode()
print(content)
except RuntimeError:
print("パスワードが間違っています")
プログラムは大きく以下の手順を踏んでいます。
-
getpass
を使ってパスワードを取得 -
zipfile
を使ってパスワード付きzipファイルを読み込み
getpass
を使ってパスワードを取得
getpass
はpythonの標準モジュールです。今回、パスワードをソースコードに直接書きたくなかったため、使用しました。
代替案として、環境変数で定義するなどがあると思います。
getpass.getpass()
を実行すると、テキストボックスが表示されるので、パスワードを入力します。後に紹介するzp.open()
がbytesを入力として受け取るので、bytes型に変形します。
zipfile
を使ってパスワード付きzipファイルを読み込み
zipfile
はpythonの標準モジュールです。
zp.namelist()
はzipファイルに含まれるディレクトリ名、ファイル名を返します。
zp.open(fileName, pwd=p)
はファイルの内容を読み込みます。pwdにパスワードをbytes型で渡します。f.read()
ではbytes型が返されるので文字列型に変形します。
高速化
もし圧縮ファイルの形式が選択できるなら、7z形式で圧縮すると圧縮、解凍共に高速だと思います。zipのときと比べて体感9倍ほど早くなったように感じます。
7z形式のファイルもpy7zr
を使うことでpythonで扱うことができます。
以下にmacでの7z形式のパスワード付き圧縮ファイルの作り方、py7zr
を使ったソースコードを紹介します。
macでの7z形式のパスワード付き圧縮ファイルの作り方
macで7z形式の圧縮ファイルを作るにはp7zip
を使います。
他にsevenzip
というものもありますが、p7zip
の方が改良版だという情報がありました。詳しくはこちら
brew install p7zip
パスワード付きの圧縮は以下のようにします。
7z u -p 圧縮ファイル名.7z 圧縮したいフォルダ(ファイル)名
全体像(py7zr version)
ソースコードはこちらです。
import py7zr
import getpass
p = getpass.getpass()
zipFilePath = ".7z" # 7zファイルのパスを指定して下さい
with py7zr.SevenZipFile(zipFilePath, 'r', password=p) as zip:
allfiles = zip.getnames()
with py7zr.SevenZipFile(zipFilePath, 'r', password=p) as zip:
for fname, bio in zip.read(allfiles).items():
content = bio.read().decode()
print(content)
動かすためにはpip install py7zr
でインストールする必要があります。
py7zr
では、パスワードは文字列型で渡さないとエラーが起こるので気をつけて下さい。
参考文献
Google Colab でトークン等の秘密データを扱う場合にはどうしたらいいのか?
getpass
PythonでZIPファイルを圧縮・解凍するzipfile
zipfile
[解決!Python]py7zrパッケージを使って7-Zip(.7z)アーカイブを展開したり、ファイルを読み込んだりするには
py7zr