Python で zip ファイルを解凍せずにリネームする

最近は寒い。iPhone 12 mini を買ったので、カメラを生かすべく外に出たいと思うも寒くて億劫になる。

仕事で急に締め切りが設定されてイラッとしたりもしている。チームで一つのものを作るならそれなりの手順や準備があるのだと思うのだけど、どうも上司がそのようなことを考えていない気がする。そのせいで手戻りが生じているのを見ると社会だなぁと思う。

週末は久しぶりに学生時代にお世話になった先輩と飲んだのだがとても楽しかった。業界を離れたからこそ、業界の人事について率直な意見を持てるようになった気がする。頭が良くて早く質の高い仕事はできるが一貫した自分の研究テーマを持てない人、問題を解くのは得意だけど作るのが苦手な人は苦労する傾向にある。

あとは三体Ⅲをちまちまと読み進めている。英語なのでとても時間がかかるが、ようやく8割近くまで読み終わった。中盤かなり盛り上がる場面があるのだけど、最近読んでいるところは落ち着いている。Ⅲの主人公は読んでる側としては結構好き嫌いが分かれる造形なんじゃないかと思う。僕はあまり好きではない。

話は変わるが、インターネットから落とした zip ファイルの名前を変えたいことがあると思う。zipファイルの名前は意味のない文字列だけど、内部のファイルなどはちゃんとした名前がついているのでそれらの情報からリネームしたいという状況。例えば、01234.zip という zip があって、中身は cat1.jpgcat2.jpg…などどなっている時のことだ。一旦解凍して名前を付け直せばいいかもしれないが、例えば python なら以下のようなコードでリネームできる

import zipfile
import subprocess

pathname = '01234.zip'
with zipfile.ZipFile(pathname) as z:
    new_name = z.infolist()[0].filename.split('.')[0]
    
    cmd = f'mv {pathname} {new_name}.zip'
    subprocess.call(cmd.split())

zipfileモジュールを使うと、zip ファイルの中の情報が取得できるので、それを使ってリネームする。infolist() は zip 内のファイルのリストになっており、filename オブジェクトがファイル名を持っている。リネームの際には単にシェルの mv コマンドを呼んでいる。先の例で言うと、 01234.zip というファイルが cat1.zip とリネームされるコードになっている。

実際にどのようなリネームをするかは zip 内のファイル構成に依存するので上のはあくまで一例。あと大抵ネットから落としてきたものはエンコーディングが様々なので、その辺の処理を泥臭く書く必要もある。