Python3
4
どのような問題がありますか?

この記事は最終更新日から3年以上が経過しています。

投稿日

更新日

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

なにをするのか

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

新規登録して、もっと便利にQiitaを使ってみよう

  1. ユーザーやタグをフォローできます
  2. 便利な情報をストックできます
  3. 記事の編集提案をすることができます
ログインすると使える機能について
safari029

コメント

この記事にコメントはありません。
あなたもコメントしてみませんか :)
新規登録
すでにアカウントを持っている方はログイン
記事投稿イベント開催中
エンジニア夏休み企画!~自由研究や読書感想文を発表しよう~
~
Go強化月間~開発する上で知っておくべき知見を共有しよう~
~
4
どのような問題がありますか?
新規登録して、Qiitaをもっと便利に使ってみませんか

この機能を利用するにはログインする必要があります。ログインするとさらに下記の機能が使えます。

  1. ユーザーやタグのフォロー機能であなたにマッチした記事をお届け
  2. ストック機能で便利な情報を後から効率的に読み返せる
新規登録ログイン
ストックするカテゴリー