LoginSignup
5
4

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-05-28

なにをするのか

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

原因

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

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

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

環境

Python 3.6.3

やり方

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

②以下修正を加える

# 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

5
4
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
5
4