1

我有一个 tar.bz2,里面有一个特定的 .gz 文件列表。在 tar.bz2 中搜索并找到 .gz 文件后,我想将这些特定的 .gz 文件加载到缓冲区中。然后我想解压缩那些加载的 .gz 文件。最后,我想将解压后的 .gz 文件加载为 .mat 文件。我想这样做而不必生成外部文件。

注意:.gz 压缩文件只是一个 .mat 文件,而不是压缩文件的进一步列表。

所以来说明压缩架构:big_file.tar.bz2 -> cat.gz, dog.gz, hello.gz, hello1.gz hello.gz -> hello(单个.mat文件)

tar.bz2 中的匹配文件名是 'hello',就像在标记为 'hello.gz'、hello1.gz' 等的文件中一样。

我当前的问题是在 tar_bz2.extractfile() 之后无法正确获取缓冲区格式。

片段中的错误是在 loadmat() 作为文件末尾的寻找问题,但我确信我的问题的根源在 tar_bz2.extractfile() 之后开始。

这是我到目前为止所拥有的:

import tarfile
import gzip
from scipy.io import loadmat

def extract_mat_data(file):
    match_filename = 'hello'
    # Decompress tar.bz2
    mat_file_data = []
    with  tarfile.open(file,'r:bz2',errorlevel=1) as tar_bz2:
        # Loop over all the sub compressed files
        for file_ in tar_bz2:
            # Match only the files with the desired file name.
            if match_filename in file_.name:
                # Extract the match file into a buffer
                file_in_file = tar_bz2.extractfile(file_)
                # Extract the gz file from a buffer
                gz = gzip.GzipFile(fileobj=file_in_file.fileobj,mode='rb')
                # Load the mat format buffer object
                single_mat_data = loadmat(gz)
                # Create a list with the mat data
                mat_file_data.append(single_mat_data)
    return mat_file_data

file = 'big_file.tar.bz2'
extract_mat_data(file)
4

0 回答 0