pyminizipって?
ファイルのzip圧縮をpythonで出来ますよってやつ。
pythonの標準ライブラリでzipfile
ってのもあるけど、こっちはzipにパスワードがかけれない。
今回はパスワードをかけたかったのでpyminizip
を使ってみた。
私の環境
windows10(Pro)です。
pythonはPython 3.7.1
です.あんま関係ないかもだけど。
この記事は僕みたいなMicrosoft社の甘い蜜を吸い続けているWindowsユーザ向けです。
UNIX民は自力で何とかするよね!
インストール
以下のコマンドを打つだけ
pip install pyminizip
どうやって使うの
こんな感じで書いたらオッケー
import pyminizip
pyminizip.compress(
'ソースファイル名',
'ソースファイルプレフィックス',
'出力ファイル名.zip',
'パスワード',
int(0) #圧縮率:0~9 (0は無圧縮)
)
第1引数:zip圧縮したいファイル名
第2引数:zip圧縮後,ファイルを置きたいディレクトリ
第3引数:出力ファイル名
第4引数:パスワード
第5引数:圧縮率.0~9を指定できる.0は無圧縮
例えば、pyminizip.compress('src/src.txt', 'dir', 'output.zip', 'password', int(0))
という風に実行すると、実行した場所にdir/src.txt
を内部に持つzipファイルがoutput.zip
というファイル名で出力される。
本題
日本人ならソースファイル名とか出力ファイル名とか、日本語で出力したいときありますよね?
でも、pyminizip
は普通に文字列を投げただけじゃエラーが出ます。エラーは以下のように出てきます。
Traceback (most recent call last):
File "test_zip.py", line 28, in <module>
test1()
File "test_zip.py", line 16, in test1
int(0)
OSError: error in opening output/テスト.txt for reading
で、どうすれば良いかというと、次のようにしてあげます。
import pyminizip
pyminzip.compress(
'ソースファイル名'.encode('cp932'),
'ソースファイルプレフィックス'.encode('cp932'),
'出力ファイル名.zip'.encode('cp932'),
'パスワード'.encode('cp932'),
int(0) #圧縮率:0~9 (0は無圧縮)
)
文字コードをcp932
にしてあげると通ります。
Windowsがcp932
を使っているのが理由でしょうね。
まとめ
パスワード付きのzipファイルを作りたいけど、標準ライブラリのzipfile
じゃできないから、pyminizip
使おうとしたけど、日本語ファイルでエラー出るじゃんってときの解決方法でした。
誰かの役に立てば良し。
思い返して見るのも良し。
参考
pyminizip:公式のやつ