在.tar中提取文件,而不是解压缩.tar

问题描述 投票:0回答:1

我需要从单个.tar文件中的多个.gz文件中提取.tex文件。我写了一些成功执行此操作的代码,但我解压缩.tar和每个.gz文件。有没有办法避免这么多解压缩?我想直接导航到.tex文件,只提取这些文件。

def extractFile(filename):
    tar = tarfile.open(filename)
    for item in tar:
        # Extract from .tar into 'temp' subfolder only if .gz
        if item.name.endswith('.gz'):
            item.name = os.path.basename(item.name) # reset path to remove parent directories like '0001'
            if not os.path.isdir('temp'):
                os.makedirs('temp')
            tar.extract(item, path='temp')
            # Extract from .gz into 'temp' subfolder only if .tex
            try: 
                gz = tarfile.open('temp/' + item.name, mode='r:gz')
                for file in gz:
                    if file.name.endswith('.tex'):
                        gz.extract(file, path='latex')
            except tarfile.ReadError:
                # Move to 'error' folder, ensuring it exists
                if not os.path.isdir('error'):
                    os.makedirs('error')
                os.rename('temp/' + item.name, 'error/' + item.name)
python tar unzip gz tarfile
1个回答
1
投票

我能够在评论的帮助下回答我的问题。 (谢谢!)我的代码现在从单个.tar文件中的多个.gz文件中提取.tex文件,而不将每个.gz文件解压缩/保存到计算机。

def extractFile(filename):
    tar = tarfile.open(filename)
    for subfile in tar.getmembers():
        # Open subfile only if .gz
        if subfile.name.endswith('.gz'):
            try: 
                gz = tar.extractfile(subfile)
                gz = tarfile.open(fileobj=gz)
                # Extract file from .gz into 'latex' subfolder only if .tex
                for subsubfile in gz.getmembers():
                    if subsubfile.name.endswith('.tex'):
                        gz.extract(subsubfile, path='latex')
            except tarfile.ReadError:
                # Add subfile name to error log
                with open('error_log.txt', 'a') as log:
                    log.write(subfile.name + '\n')
© www.soinside.com 2019 - 2024. All rights reserved.