- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:PythonでZIP中のZIPを操作する方法)
PythonでZIP中のZIPを操作する方法
このQ&Aのポイント
- PythonでZIP内のZIPを再帰的に探して操作する方法を知りたい
- ZIPファイル中のZIPファイルを操作するためには一時ファイルを使用する必要があるか悩んでいる
- ZIPファイルの中にあるファイルに対してzipfile.ZipFile()を使うとZIPファイルとして認識されない
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
このサイトでは、連続する空白は1つにまとめられ、タブ文字は削られます。 Pythonではインデントが重要な役目を持っているので、全角空白を使うとか、別な文字(^だの_だの)で代りにするとしましょう。 > for f in zip.namelist(): で取り出せるfは、ZIPの中での一覧での名前です。実際にそのファイルがファイルシステム上に存在するわけではないし、その「ZIp内のファイル」にアクセスするために「ファイルのように振舞うオブジェクト」を返すわけでもありません。isZipfileで失敗するのは当然でしょう。 zipfileのマニュアルを読んでみると read(ZIP内の名前) でバイト列として取り出せるようなので、 fp=StringIO.StriingIO(zip.read(f)) などとファイル風オブジェクトにして listZipFile( fp, "¥t"+ indent ) とするのはどうでしょう。
お礼
kmeeさん、アドバイスありがとうございます。 おかげさまで解決しました。 以下が改造したコードです。 import zipfile import io def listZipFile( file, fileName, indent ) : try : zip = zipfile.ZipFile( file, 'r' ) print( "zip" + indent + fileName ) except zipfile.BadZipfile : print( "not zip" + indent + fileName ) return for name in zip.namelist(): fobj = io.BytesIO( zip.read( name ) ) listZipFile( fobj, name, "¥t"+ indent ) zip.close() zipFileName = 'SampleZip1.zip' listZipFile( zipFileName, zipFileName, "¥t" ) 「 実行結果 」 >findZip2.py zip SampleZip1.zip not zip Sample2.txt zip SampleZip1-1.zip not zip Sample1-1-2.txt not zip Sample1-1-1.txt zip SampleZip1-2.zip not zip Sample1-2-2.txt not zip Sample1-2-1.txt not zip Sample1.txt 我ながらブサイクなコードになってしまいましたが、少し紆余曲折がありました。 ・cStriingIO も StriingIOもimportできず。 ネットでVer.3系ではモジュールもクラスも変わったことを知る。 ・ファイルオブジェクトに対してはzipfile.is_zipfile()がかけられないトラブル。 TypeError: invalid file: <io.BytesIO object at 0x00C552A0> 強引にzipfile.ZipFile()をかけ、例外が発生するか否かでZIP判定するようにした。 ・BytesIOでファイルオブジェクト化したものにはname属性がなく、ファイル名が得られないトラブル。 AttributeError: 'BytesIO' object has no attribute 'name' 結局、メソッドに「ファイル名あるいはファイルオブジェクト」と「ファイル名」の2つのパラメタを渡すというブサイクな解決方法。 ともあれ動くようにはなったので良しとしようかと思います。 あらためてお礼申し上げます。 ありがとうございました。