6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

pyminizipの日本語パスについて

Last updated at Posted at 2020-02-18

pyminizipって?

ファイルのzip圧縮をpythonで出来ますよってやつ。
pythonの標準ライブラリでzipfileってのもあるけど、こっちはzipにパスワードがかけれない。
今回はパスワードをかけたかったのでpyminizipを使ってみた。

私の環境

windows10(Pro)です。
pythonはPython 3.7.1です.あんま関係ないかもだけど。
この記事は僕みたいなMicrosoft社の甘い蜜を吸い続けているWindowsユーザ向けです。
UNIX民は自力で何とかするよね!

インストール

以下のコマンドを打つだけ

pip install pyminizip

どうやって使うの

こんな感じで書いたらオッケー

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

で、どうすれば良いかというと、次のようにしてあげます。

test_zip.py
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:公式のやつ

6
3
1

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
6
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?