Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@safari029

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

やり方

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

②以下修正を加える

# 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

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  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

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?