【PythonでZIPファイル中のZIPファイルを操作したい】
PythonでZIP内のZIPを再帰的に探して操作したいと考えています。
スクリプトを書いてみたのですが、どうもうまくいきません。
どなたかマズところをご教示いただけないでしょうか?
以下のような構造のデータファイルを用意しました。
SampleZip1.zip
Sample1.txt
Sample2.txt
SampleZip1-1.zip
Sample1-1-1.txt
Sample1-1-2.txt
SampleZip1-2.zip
Sample1-2-1.txt
Sample1-2-2.txt
以下がテストスクリプトです。
import zipfile
def listZipFile( fileName, indent ) :
if not zipfile.is_zipfile( fileName ) :
print( "not zip" + indent + fileName )
return
print( "zip" + indent + fileName )
zip = zipfile.ZipFile( fileName, 'r' )
for f in zip.namelist():
listZipFile( f, "¥t"+ indent )
zip.close()
zipFileName = 'SampleZip1.zip'
listZipFile( zipFileName, "¥t" )
が、結果は以下の通りで、ZIPの中のZIPをZIPファイルと判定してくれないみたいです。
>findZip.py
zip SampleZip1.zip
not zip SampleZip1-2.zip
not zip Sample1.txt
not zip Sample2.txt
not zip SampleZip1-1.zip
ZIPファイル中のファイルに対してzipfile.ZipFile()を使うのは無理があるのかなぁ?
一時ファイルにでもいったん出さないとダメ?
などと想像しているのですが・・・
どなたかよろしくお願いいたします。
No.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つのパラメタを渡すというブサイクな解決方法。
ともあれ動くようにはなったので良しとしようかと思います。
あらためてお礼申し上げます。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(セキュリティ) PDFファイルのパスワード設定について 1 2022/06/25 10:10
- その他(セキュリティ) ZIPというファイルでパスワード付きPDFファイルが送られてきたのですが、 パスワードを入力▶︎ファ 3 2022/07/26 19:44
- InternetExplorer(IE) 【至急】エクスプローラーでの解凍 3 2023/08/01 15:06
- iPhone(アイフォーン) iPhone ファイル iPhoneのファイルで写真をzipに圧縮した後もう一度展開すると画質は変わ 3 2022/10/21 21:53
- Windows 8 メール送信、zipファイル PDFについて 回答お願いいたします。 Windows8 メールはサクラ 1 2022/05/12 17:49
- ノートパソコン パソコンでZIPファイルをダウンロードしたいとき、 このような表示が出てダウンロードができないときは 2 2023/06/20 15:37
- C言語・C++・C# web上にギガファイルとかのウェブ上にzipファイルを載せれるサイトがあったと思うのですが、教えて頂 3 2022/09/17 02:26
- その他(コンピューター・テクノロジー) ギガファイル便で送ったzipファイルの中のwavファイルが空だと言われたのですがどういう可能性が考え 2 2022/04/24 22:29
- ドライブ・ストレージ 空き容量があるのに「空き容量が足りません」と表示されてしまう 7 2022/09/10 21:56
- Android(アンドロイド) 携帯のメモリーが少なくなって来ました。 2 2023/05/16 07:10
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルのタブをカン...
-
テキストファイルのファイル名...
-
拡張子を元に戻す
-
バッチファイルからVBAに引数を...
-
多数のサブディレクトリ内のフ...
-
VBAでワークシートを引数として...
-
EXCEl/VBAで拡張子なしのファイ...
-
バッチ処理でファイルの中身を...
-
VBAでエクセルをtxtに変換する...
-
DOSコマンドによるテキストファ...
-
ftpコマンドで複数のファイルを...
-
バッチファイルで文字列削除に...
-
.txtではなく.logの方が良いの...
-
複数のファイルデータを新しく...
-
perl ファイル内文字列抽出
-
accessでSQL文を使ってcsvファ...
-
batファイルについて
-
txtファイルが作成されない
-
vbsにてファイルが存在すればメ...
-
cshでファイルサイズ取得
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
バッチ処理でファイルの中身を...
-
VBAでワークシートを引数として...
-
.txtではなく.logの方が良いの...
-
拡張子を元に戻す
-
多数のサブディレクトリ内のフ...
-
COPYコマンドで結合すると余計...
-
バッチファイル 複数ファイル...
-
テキストファイルで提出とは?
-
バッチファイルで文字列削除に...
-
Windowsのバッチファイルを利用...
-
テキストファイルのファイル名...
-
ファイルの最後に文字列挿入
-
psqlでエラーログをとりたい
-
forfilesで検索したファイルを...
-
バッチファイルからVBAに引数を...
-
accessでSQL文を使ってcsvファ...
-
テキストファイルのタブをカン...
-
MATLABで行列を配列に格納する方法
-
renameコマンドについて
-
【Excel】 VBAを使って毎回名前...
おすすめ情報