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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

Q&A

解決済

2回答

1891閲覧

ZIPファイルを解凍せずにファイル名をリスト化したい。(Python)

Seven_Sea

総合スコア23

Jupyter

Jupyter (旧IPython notebook)は、Notebook形式でドキュメント作成し、プログラムの記述・実行、その実行結果を記録するツールです。メモの作成や保存、共有、確認などもブラウザ上で行うことができます。

Python 3.x

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

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

0グッド

0クリップ

投稿2022/05/27 10:25

教えてください。

ZIPファイルの中身を解凍することなく、ファイル名のリストにしたいです。

通常、zipfile ライブラリを使って解凍することなく、
ファイルのリストを作ることができる様ですが、
今回は、メインのZIPを解凍すると、中に別のZIPファイルがあるような形式になっています。

例)
A_Folder.zip
A.txt
B.txt
C.txt
D.zip - E.txt
F.txt
G.txt

上のような感じになっているA_Folder.zipから

A.txt
B.txt
C.txt
E.txt
F.txt
G.txt
としたいです。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

以下のコードでは拡張子(.zip or .ZIP)だけで ZIP ファイルかどうかを判断しています。また、一階層のみにしか対応していません。

python

1from zipfile import ZipFile 2from io import BytesIO 3 4zip_file = 'A_Folder.zip' 5name_list = [] 6with ZipFile(zip_file) as z: 7 for name in z.namelist(): 8 if name.lower().endswith('.zip'): 9 with z.open(name) as zz: 10 zip_data = BytesIO(zz.read()) 11 with ZipFile(zip_data) as zzz: 12 name_list += zzz.namelist() 13 else: 14 name_list.append(name) 15 16print(name_list) 17 18# 19['A.txt', 'B.txt', 'C.txt', 'E.txt', 'F.txt', 'G.txt']

投稿2022/05/27 18:51

melian

総合スコア19805

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

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

0

ベストアンサー

zipfile.ZipFileクラスのopen() メソッドを使うと、中に入っているファイルにアクセスすることができます。 これがzipファイルであった場合、それをさらにzipfile.ZipFile で開けばいいことになります。
その中にさらにzipがあったら...という場合は、再帰的に適用するようにすればいいでしょうね。


コードつきの回答も出ていますから、こちらからも例を出しましょう。

「それがzipの中のzipに使おとしたら、notfoundになりました。」のそれが何を指しているかわからないのですが、
zipf.open(<zipファイル内のファイル名>) とすれば、そのファイルのハンドラが取得できますので、それをさらにzipfile.ZipFile()で開けばいいのです。
(BytesIOを経由しなくても開けます)
以下は、zipファイルの中にさらにzipファイルが入っていても再帰的に表示するようにしたものです。

python

1import zipfile 2import pathlib 3 4def print_zipfile_namelist(infile, prefix=''): 5 6 zipf = zipfile.ZipFile(infile) 7 8 for fname in zipf.namelist(): 9 fpath = pathlib.Path(fname) 10 if fpath.suffix == '.zip': 11 print_zipfile_namelist(zipf.open(str(fpath)), prefix=f'{prefix}{fpath.name}:') 12 else: 13 print(f'{prefix}{fpath}') 14 15print_zipfile_namelist('A_Folder.zip')

投稿2022/05/27 14:47

編集2022/05/28 08:52
TakaiY

総合スコア12765

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

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

Seven_Sea

2022/05/27 18:22

それがzipの中のzipに使おとしたら、notfoundになりました。
Seven_Sea

2022/05/27 18:23

実際、二回目のzipは、解凍されてないのでないものなので。
TakaiY

2022/05/28 08:53

「二回目のzipは、解凍されてないもの」なので、解凍すればいいのです。 回答を編集してサンプルを乗せました。
Seven_Sea

2022/05/30 00:05

ありがとうございます。 試してみたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問