bz2.compress/dekompresji pracę z danych binarnych:
>>> 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'
W skrócie - trzeba przetworzyć plik zawartość ręcznie. Jeśli masz bardzo duże pliki, powinieneś preferować używanie bz2.BZ2Decompressor
do bz2.decompress
, ponieważ ta ostatnia wymaga przechowywania całego pliku w tablicy bajtów.
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))
Można również użyć bz2.BZ2File
zrobić to jeszcze prostsze:
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)
To wygląda jak niektóre zmienne są pomieszane w tym kodzie. W przeciwnym razie [dokumentacja] (http://docs.python.org/2/library/bz2.html) mówi, że dekompresja pobiera dane, a nie nazwę pliku: 'bz2.decompress (data)' – ChrisP