質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.31%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

3回答

1891閲覧

Python zipファイルの中にあるフォルダのリネームがしたい

shinyspark

総合スコア13

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

1グッド

1クリップ

投稿2023/07/13 01:55

編集2023/07/13 02:14

実現したいこと

Pythonを使って、zipファイルの中にあるフォルダに対して解凍前、もしくは解凍直後にそのフォルダの名前を変えたい

前提

Aというzipファイルの中にBというフォルダがあり、そのBの中に画像ファイルがあるとします。
Bの名前はわからない、という状態のときにzipファイルの解凍前後にBを指定して名前の変更を行う方法はあるのか、というところが気になっています。
zipfileモジュールを利用して解凍まではできているのですが、名前の不定なフォルダに対してどうすれば名前の変更を行えるのかがわからないです。

A.zip
|ーB
ー|ー001~~.jpg
ー|ー002~~.jpg
ー|ー003~~.jpg

該当のソースコード

Python3

1zip = A.zip 2 3with zipfile.ZipFile(zip) as z: 4 for info in z.infolist(): 5 info.filename = info.filename.encode('cp437').decode('cp932') 6 z.extract(info, 'testdir')

現在ファイルの解凍に使っているコードです。

試したこと

pathlibもos.renameも使えないかとやってみたのですが、名前を変えるにはファイルパスの指定が必要であるため、わたしの知識ではフォルダの名前が不定なものに使うのは少し厳しかったです。

補足情報(FW/ツールのバージョンなど)

VScode上でPythonを動かしています。
Bの名前の変更はできなくても解凍した後にBの中身を別のフォルダに取り出す方法などがあればぜひとも教えていただきたいです。

glyzinieh👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

リネームしたいフォルダが「B」といった1個だけなら以下の流れでよいかと思います。

  • そのまま解凍
  • 解凍先からフォルダを探す
  • 見つかったらフォルダ名をリネームして終了

Python

1import zipfile 2import os 3import glob 4 5ext_dir = 'testdir' 6new_name = 'hoge' 7 8with zipfile.ZipFile('A.zip') as z: 9 for info in z.infolist(): 10 info.filename = info.filename.encode('cp437').decode('cp932') 11 z.extract(info, ext_dir) 12 13for path in glob.glob(f'{ext_dir}/*'): 14 if os.path.isdir(path): 15 os.rename(path, os.path.join(ext_dir, new_name)) 16 break

投稿2023/07/13 02:25

can110

総合スコア38352

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinyspark

2023/07/13 04:30

無事に思い通りの動きをさせることができました、とても勉強になります。 ありがとうございました。
guest

0

BAついていますし、他の方のとあまり変らない方法ですが、質問にも出てくるinfo.filenameは展開するときのパスなので、これを加工すれば任意の場所に展開できます。

python

1with zipfile.ZipFile(zip) as z: 2 for info in z.infolist(): 3 # パスを取得 4 fname = info.filename 5 # pathlibを使ってパスを分解 6 parts = list(pathlib.Path(fname).parts) 7 # 先頭を任意の名前に変更 8 parts[0] = 'new_dir' 9 # 変更後の名前を生成して info.filenameを上書き 10 info.filename = '/'.join(parts) 11 12 z.extract(info, 'testdir')

ここではpathlib.Path.parts を使いましたが、info.filenameは文字列なので、好きな方法で加工すればいいでしょう。

投稿2023/07/13 07:15

TakaiY

総合スコア14317

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinyspark

2023/07/14 00:46

なるほど・・・そういう仕組みなんですね。 とても勉強になります、ありがとうございました。
guest

0

os.path.basenameを使えばいいのではないでしょうか。
階層が2以上のファイルがある場合は文字列処理(str.split)で最上位のディレクトリを除去するなどですかね。

下記で、testdir以下にファイルが直接展開されると思います。

python

1import zipfile 2import os.path 3 4zipname = 'A.zip' 5 6with zipfile.ZipFile(zipname) as z: 7 for info in z.infolist(): 8 if not info.is_dir(): 9 info.filename = os.path.basename(info.filename.encode('cp437').decode('cp932')) 10 # info.filename = info.filename.encode('cp437').decode('cp932').split('/', 1)[-1] 11 z.extract(info, 'testdir')

B(不明)を hoge に変えて展開したいとかなら、z.extract(info, 'testdir/hoge') にすればいいです。

投稿2023/07/13 03:38

編集2023/07/13 04:32
bsdfan

総合スコア4901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

shinyspark

2023/07/13 04:32

osモジュールは本当にいろいろとあるんですね・・・ とても勉強になりました、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.31%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問