Ограничение декомпрессии файла bz2 с использованием python? - PullRequest
1 голос
/ 25 марта 2019

У меня есть множество файлов, сжатых в формате bz2, и я пытаюсь распаковать их во временный каталог, используя Python для последующего анализа.Существуют сотни тысяч файлов, поэтому распаковка файлов вручную невозможна, поэтому я написал следующий сценарий.

Моя проблема заключается в том, что всякий раз, когда я пытаюсь это сделать, максимальный размер файла составляет 900 КБ, даже еслиручная распаковка имеет каждый файл около 6 МБ.Я не уверен, является ли это недостатком моего кода и как я сохраняю данные в виде строки для последующего копирования в файл или проблемы с чем-то другим.Я пробовал это с разными файлами, и я знаю, что это работает для файлов размером менее 900 КБ.Кто-нибудь еще сталкивался с подобной проблемой и знает решение?

Мой код приведен ниже:

import numpy as np
import bz2
import os
import glob

def unzip_f(filepath):
    '''
    Input a filepath specifying a group of Himiwari .bz2 files with common names
    Outputs the path of all the temporary files that have been uncompressed

    '''


    cpath = os.getcwd() #get current path
    filenames_ = []  #list to add filenames to for future use

    for zipped_file in glob.glob(filepath):  #loop over the files that meet the name criterea
        with bz2.BZ2File(zipped_file,'rb') as zipfile:   #Read in the bz2 files
            newfilepath = cpath +'/temp/'+zipped_file[-47:-4]     #create a temporary file
            with open(newfilepath, "wb") as tmpfile: #open the temporary file
                for i,line in enumerate(zipfile.readlines()):
                    tmpfile.write(line) #write the data from the compressed file to the temporary file



            filenames_.append(newfilepath)
    return filenames_


path_='test/HS_H08_20180930_0710_B13_FLDK_R20_S*bz2'
unzip_f(path_)   

Возвращает правильные пути к файлам с неправильными размерами, ограниченными 900 кб.

1 Ответ

1 голос
/ 26 марта 2019

Оказывается, эта проблема связана с тем, что файлы являются многопоточными, что не работает в Python 2.7.Здесь больше информации здесь , как упомянуто jasonharper и здесь .Ниже приведено решение, использующее команду Unix для распаковки файлов bz2 и их перемещения во временный каталог, который я хочу.Это не так красиво, но это работает.

import numpy as np
import os
import glob
import shutil

def unzip_f(filepath):
    '''
    Input a filepath specifying a group of Himiwari .bz2 files with common names
    Outputs the path of all the temporary files that have been uncompressed

    '''


    cpath = os.getcwd() #get current path
    filenames_ = []  #list to add filenames to for future use

    for zipped_file in glob.glob(filepath):  #loop over the files that meet the name criterea
        newfilepath = cpath +'/temp/'   #create a temporary file
        newfilename = newfilepath + zipped_file[-47:-4]

        os.popen('bzip2 -kd ' + zipped_file)
        shutil.move(zipped_file[-47:-4],newfilepath)

        filenames_.append(newfilename)
    return filenames_



path_='test/HS_H08_20180930_0710_B13_FLDK_R20_S0*bz2'

unzip_f(path_)   
...