経緯
pythonでzipを一気に展開しようと目論んだが、日本語ファイルが含まれているものだと、とにかく文字化けする or エラーになる。web検索やAIを使って解決できないかと模索したところ一応解決できたのでここに書いていこうと思う。
試したこと
まず、こちらの記事の方法を試した。
この記事で紹介されていたのはpython標準で使用できるZipFile ライブラリを用いたものだ。Windows標準エクスプローラーで作成されたZIPはcp932になることが多い。pythonではzipは基本的にcp437で格納とみなされる。だから「一回cp437でエンコード(バイトに戻す)→ cp932で読み直す」という方法。
import os
import zipfile
f = r'/file/to/path'
with zipfile.ZipFile(f) as z:
for info in z.infolist():
info.filename = info.orig_filename.encode('cp437').decode('cp932')
if os.sep != "/" and os.sep in info.filename:
info.filename = info.filename.replace(os.sep, "/")
z.extract(info)
結果うまくいかなかった。文字列をエンコードする際に下記のエラーを吐いてしまった(~_~)。
UnicodeEncodeError: 'charmap' codec can't encode characters in position 2-8: character maps to <undefined>
解決編!!!
7-Zipを用いてzipファイルを展開することで解決!数時間格闘した結果自分の環境ではライブラリだけじゃどうにもならなかったので外部ソフトを頼ってみた。
import subprocess
zip_path = r"hoge\hoge\hoge"
extract_path = r"hoge\hoge\hoge"
# 7-Zipコマンドを実行 (x:展開, -o:出力先, -y:全て上書き許可)
subprocess.run(
[
r"C:\Program Files\7-Zip\7z.exe",
"x",
zip_path,
f"-o{extract_path}",
"-y",
],
check=True,
)
外部ソフトの呼び出しという少し釈然としない解決方法になってしまったが、動いたのでヨシ!!!
感想
pythonでzipファイルを展開したいだけだったのにまさかここまで苦戦を強いられるとは思ってもいなかった。もっとスマートな解決方法があれば教えていただきたい。ともあれ、動作はするので手段に困った方にはぜひ参考にしていただきたいとも思う。