2013-06-06 11 views
14

Chciałbym rozpakować pliki w różnych katalogach, które są na różnych trasach. I kody jak poniżej, a błąd jest nieprawidłowy strumień danych. Proszę pomóż mi. Dziękuję bardzo.Dekompresuj pliki bz2

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) 
+1

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

Odpowiedz

10

bz2.decompress wybija sprężone dane i napełnia go. Podajesz nazwę pliku, a nie dane w pliku!

Czy to zamiast:

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 
+0

Ciągle wychodzi z pliku błędu * nie jest gotowy do napisania * Dziękujemy –

+0

Skopiuj odpowiedzi napisane po moim? Chciałbym. Plik zostanie zamknięty, ponieważ nie ma nazwy, a Python ma licznik odwołań. –

1

To powinno działać

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())) 
+0

z open (ścieżka_archiwum,'rb ') jako source, open (outfile_path,' wb ') jako dest: ^ SkładniaError: nieprawidłowa składnia. Nadal występuje błąd. Dziękuje bardzo –

+0

To jest składnia python3. Spróbuj: 'from __future__ import with_statement'. Jeśli to nadal nie działa, przerwij instrukcję "ẁith' w dwóch krokach, jak w anime Juraj Ivančicia – michaelmeyer

+0

Za późno - zmieniłem moje, by używać łańcuchów z instrukcjami po zobaczeniu twojej odpowiedzi. Nie wiedziałem o tym, dzięki! –

15

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) 
+0

+1 dla jasnego wyjaśnienia – michaelmeyer