2017-12-07 6 views
1

30,000のフォルダがあり、各フォルダには5つのbz2ファイルのjsonデータが含まれています。python os walkで30,000のサブフォルダ内のbz2ファイルを解凍しますか?

os.walk()を使用してファイルパスをループし、各圧縮ファイルを解凍して元のディレクトリに保存しようとしています。

import os 
import bz2 

path = "/Users/mac/PycharmProjects/OSwalk/Data" 
for(dirpath,dirnames,files) in os.walk(path): 

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) 

コードの実行中に次のエラーが発生します。

File 
"/Library/Frameworks/Python.framework/Versions/3.6/lib/python3.6/_compr 
ession.py", line 103, in read 
data = self._decompressor.decompress(rawblock, size) 
OSError: Invalid data stream 

私は何か他のものを解凍方法でMac上でコードを実行しているか、私が行方不明です問題があり得ること読みましたか?

答えて

0

すでに圧縮解除された結果を解凍しようとしているようです。それらをフィルタリングする必要があります。

import os 
import bz2 

path = "/Users/mac/PycharmProjects/OSwalk/Data" 
for (dirpath, dirnames, files) in os.walk(path): 
    for filename in files: 
     # filter out decompressed files 
     if filename.endswith('.decompressed'): 
      continue 

     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

if文に追加しましたが、コードは実行されません。私はbz2インポートモジュールでそれがあるのだろうか? – tomoc4

+0

それは異なります。これらのファイルをどのように圧縮しますか? – kichik

+0

.tar形式のWebからファイルをダウンロードしました。私はtarを通常のフォルダディレクトリに変換しました。圧縮は私が仮定したサーバーから行われました – tomoc4

関連する問題