Help us understand the problem. What is going on with this article?

Windows向けにファイル名をShift-JISでZIP圧縮する(with zipfile)

More than 1 year has passed since last update.

なにをするのか

python3でzipfileを使って日本語名のファイルをフォルダ事圧縮した場合、Windowsのエクスプローラーで解凍するとzipされたファイルが文字化けしてしまう。

原因

Windowsのエクスプローラーを使ってのzip解凍はShift-JIS(cp932)で解釈するため、zipfileモジュールを使った圧縮(UTF-8)だと、文字化けが発生する。つまりzipする際のファイル名のエンコードをShift-JISに指定すればOK。ただ、そんなオプションはなかったのでzipfileモジュールを直接いじる必要がある。

ちなみにLhaplusなどのちょっと賢い圧縮解凍ソフトならUTF-8でもちゃんと理解できるんだけどね。

あくまでその場しのぎの方法です、自己責任でご利用ください

環境

Python 3.6.3

やり方

①まずソースコードをコピー

https://github.com/python/cpython/blob/3.6/Lib/zipfile.py

②以下修正を加える

# 430行目あたり~ 
    def _encodeFilenameFlags(self):
        try:
            return self.filename.encode('ascii'), self.flag_bits
        except UnicodeEncodeError:
            #return self.filename.encode('utf-8'), self.flag_bits | 0x800 #この行をコメントアウト
            return self.filename.encode('cp932'), self.flag_bits #Shift-JIS(cp932)を指定する。

③実行プロジェクトと同一のフォルダに設置して後は呼び出すだけ。

※注意事項※ モジュール呼び出し順序について

今回標準モジュールを作りなおしてるのだが、もともとのzipfileはPYTHONPATHに含まれる。
sys.pathでpathを通しても先に標準モジュールが呼び出される。
そのため同一フォルダに設置するなど、優先順位をあげるか別名で保存する必要がある。

参考までにファイルの検索順は以下の通りとなっている。

  1. 実行中のファイルと同じフォルダ
  2. カレントフォルダ
  3. 環境変数「PYTHONPATH」に列挙したフォルダ
  4. sys.pathに登録してあるフォルダ

参考

moduleのimportの仕組み
http://python.matrix.jp/pages/tips/import.html#id3

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away