2013-06-06 4 views
14

मैं अलग-अलग मार्गों में विभिन्न निर्देशिकाओं में फ़ाइलों को डिक्रॉप करना चाहता हूं। और नीचे दिए गए कोड और त्रुटि अमान्य डेटा स्ट्रीम है। कृपया मेरी मदद करें। बहुत बहुत धन्यवाद।डीकंप्रेस 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

ऐसा लगता है आपके चर के कुछ है कि कोड में मिश्रित कर रहे हैं की तरह। अन्यथा, [प्रलेखन] (http://docs.python.org/2/library/bz2.html) कहता है कि डिकंप्रेस डेटा लेता है, फ़ाइल नाम नहीं: 'bz2.decompress (डेटा)' – ChrisP

उत्तर

10

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

अभी भी त्रुटि * फ़ाइल से बाहर निकलता है लिखने के लिए तैयार नहीं है * धन्यवाद –

+0

मेरे बाद लिखे उत्तरों की प्रतिलिपि बनाएँ? मैं चाहता हूँ। फ़ाइल बंद हो जाती है क्योंकि इसका कोई नाम नहीं है और पायथन का संदर्भ काउंटर है। स्रोत के रूप में खुले (archive_path, 'rb') के साथ –

1

यह काम करना चाहिए

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

, खुले (outfile_path, 'wb') के रूप में खोलें: ^ सिंटेक्स त्रुटि: अमान्य वाक्यविन्यास। अभी भी एक त्रुटि है। बहुत धन्यवाद –

+0

यह python3 वाक्यविन्यास है। आज़माएं: '__future__ से आयात_स्टेटमेंट' से। यदि यह अभी भी काम नहीं करता है, तो दो चरणों में 'ẁith' कथन को तोड़ें, जैसे जुराज इवानसीक के उत्तर – michaelmeyer

+0

बहुत देर हो चुकी है - मैंने आपकी प्रतिक्रिया देखने के बाद बयान के साथ जंजीर का उपयोग करने के लिए मेरा बदल दिया। इसके बारे में नहीं पता था, धन्यवाद! स्पष्ट स्पष्टीकरण के लिए –

15

bz2.compress/बाइनरी डेटा के साथ काम करने को संपीड़ित:

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

+1 – michaelmeyer

संबंधित मुद्दे