0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

パスワード付きzipファイルをpythonで扱う方法、7zを扱った高速化まで

Last updated at Posted at 2024-06-03

はじめに

パスワード付きzipファイルをpythonで扱う方法をまとめます。
機械学習などプログラムで扱いたいデータが外に出てはいけないものの場合、役に立つと思います。
今回は、ファイルとして出力せず、プログラムでファイルの内容のみ出力するコードを紹介します。ファイルとして出力したい方は参考文献に記載しているこちらが参考になると思います。
なお、圧縮ファイルの形式が選べる方は、7z形式を使うと高速だと思います。

全体像(zip version)

ソースコードはこちらです。

unzip.py
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("パスワードが間違っています")

プログラムは大きく以下の手順を踏んでいます。

  1. getpassを使ってパスワードを取得
  2. 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)

ソースコードはこちらです。

unzip.py
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

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?