別のルートにある別のディレクトリのファイルを解凍したいと思います。そして、以下のようにコーディングし、エラーは無効なデータストリームです。私を助けてください。どうもありがとうございます。
import sys
import os
import bz2
from bz2 import decompress
path = "Dir"
for(dirpath,dirnames,files)in os.walk(path):
for file in files:
filepath = os.path.join(dirpath,filename)
newfile = bz2.decompress(file)
newfilepath = os.path.join(dirpath,newfile)
bz2.compress/decompressはバイナリデータを処理します。
>>> import bz2
>>> compressed = bz2.compress(b'test_string')
>>> compressed
b'BZh91AY&SYJ|i\x05\x00\x00\x04\x83\x80\x00\x00\x82\xa1\x1c\x00 \x00"\x03h\x840"
P\xdf\x04\x99\xe2\xeeH\xa7\n\x12\tO\x8d \xa0'
>>> bz2.decompress(compressed)
b'test_string'
つまり、ファイルの内容を手動で処理する必要があります。非常に大きなファイルがある場合は、bz2.BZ2Decompressor
からbz2.decompress
を使用することをお勧めします。後者の場合、ファイル全体をバイト配列に格納する必要があるためです。
for filename in files:
filepath = os.path.join(dirpath, filename)
newfilepath = os.path.join(dirpath,filename + '.decompressed')
with open(newfilepath, 'wb') as new_file, open(filepath, 'rb') as file:
decompressor = BZ2Decompressor()
for data in iter(lambda : file.read(100 * 1024), b''):
new_file.write(decompressor.decompress(data))
bz2.BZ2File
を使用して、これをさらに簡単にすることもできます。
for filename in files:
filepath = os.path.join(dirpath, filename)
newfilepath = os.path.join(dirpath, filename + '.decompressed')
with open(newfilepath, 'wb') as new_file, bz2.BZ2File(filepath, 'rb') as file:
for data in iter(lambda : file.read(100 * 1024), b''):
new_file.write(data)
bz2.decompress
は圧縮されたdataを受け取り、それを膨らませます。ファイルのデータではなく、ファイル名を渡します!
代わりにこれを行ってください:
zipfile = bz2.BZ2File(filepath) # open the file
data = zipfile.read() # get the decompressed data
newfilepath = filepath[:-4] # assuming the filepath ends with .bz2
open(newfilepath, 'wb').write(data) # write a uncompressed file
これはうまくいくはずです
for file in files:
archive_path = os.path.join(dirpath,filename)
outfile_path = os.path.join(dirpath, filename[:-4])
with open(archive_path, 'rb') as source, open(outfile_path, 'wb') as dest:
dest.write(bz2.decompress(source.read()))