2017-12-07 11 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 형식의 웹에서 파일을 다운로드했습니다. 타르를 일반 폴더 디렉토리로 변환했습니다. 압축은 서버에서 수행되었습니다. – tomoc4