Вопрос по decompression, python – Распакуйте файлы bz2

17

Я хотел бы распаковать файлы в разных каталогах, которые находятся на разных маршрутах. И коды, как показано ниже, и ошибка неверного потока данных. Пожалуйста, помогите мне. Огромное спасибо.

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.decompress(data) ChrisP

Ваш Ответ

3   ответа
12

bz2.decompress принимает сжатыйданные и раздувает это. Вы передаете имя файла, а не данные в файле!

Сделайте это вместо этого:

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
Там все еще выходит ошибкафайл не готов к записи Спасибо MY_1129
18

bz2.com распаковывает / распаковывает работу с двоичными данными:

>>> 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)
+1 за ясное объяснение michaelmeyer
2

Это должно работать

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()))
с открытым (archive_path, 'гь») в качестве источника, откройте (outfile_path, 'термометр») как dest: ^ SyntaxError: неверный синтаксис. По-прежнему существует ошибка. Большое спасибо MY_1129
Это синтаксис Python3. Пытаться:from __future__ import with_statement, Если это все еще неработать, сломатьẁith заявление в два этапа, как в Юрай Иванчичs anser michaelmeyer
Слишком поздно - я изменил свой, чтобы использовать цепочки с заявлениями, увидев ваш ответ. Не знал об этом, спасибо! Juraj Ivančić

Похожие вопросы