【问题标题】:Python: Extracting specific files with pattern from tar.gz without extracting the complete filePython:从 tar.gz 中提取具有模式的特定文件而不提取完整文件
【发布时间】:2016-06-22 06:20:13
【问题描述】:

我想从许多 tar.gz 文件中提取所有模式为 *_sl_H* 的文件,而不是从档案中提取所有文件。

我找到了这些行,但无法使用通配符 (https://pymotw.com/2/tarfile/):

import tarfile
import os

os.mkdir('outdir')
t = tarfile.open('example.tar', 'r')
t.extractall('outdir', members=[t.getmember('README.txt')])
print os.listdir('outdir')

有人有想法吗? 非常感谢。

【问题讨论】:

    标签: python regex tar


    【解决方案1】:

    您可以从许多 tar 中提取与您的模式匹配的所有文件,如下所示:

    1. 使用glob 获取给定文件夹中所有*.tar*.gz 文件的列表。

    2. 对于每个 tar 文件,使用 getmembers() 函数获取每个 tar 文件中的文件列表。

    3. 使用正则表达式(或简单的if "xxx" in 测试)过滤所需文件。

    4. 将此匹配文件列表传递给extractall() 函数中的members 参数。

    5. 添加了异常处理以捕获编码错误的 tar 文件。

    例如:

    import tarfile
    import glob
    import re
    
    reT = re.compile(r'.*?_sl_H.*?')
    
    for tar_filename in glob.glob(r'\my_source_folder\*.tar'):
        try:
            t = tarfile.open(tar_filename, 'r')
        except IOError as e:
            print(e)
        else:
            t.extractall('outdir', members=[m for m in t.getmembers() if reT.search(m.name)])
    

    【讨论】:

    • 我认为该库不支持从 tar 存档中删除文件。为此,您需要创建一个没有提取文件的新 tar 文件。
    • 好的,感谢您的快速回复。那么在提取相关文件后删除“活动” tar.gz 文件是不可能的?否则我会遇到存储问题。
    • 要删除整个 tar 文件,请尝试在提取后和 os.remove() 之前添加 t.close()
    • 完美,谢谢!还有一件事。是否可以将具有模式“_sl_HH”的文件提取到输出目录,在新存档中压缩所有具有模式“_sl_HV”的文件,然后删除“活动”tar.gz 文件?既然我在普通 PC 上工作,那么多核呢?我必须在 HDD 上总共处理 ~2TB ..
    • 查看this question 了解如何创建 tarfile。
    【解决方案2】:

    看看TarFile.getmembers() 方法,它以列表的形式返回存档的成员。获得此列表后,您可以根据条件决定要提取哪个文件。

    import tarfile
    import os
    
    os.mkdir('outdir')
    t = tarfile.open('example.tar', 'r')
    for member in t.getmembers():
        if "_sl_H" in member.name:
            t.extract(member, "outdir")
    
    print os.listdir('outdir')
    

    【讨论】:

    • +1 关于 tarfile 的使用,真正的模块去。但是,我不确定仅提取 tar.gz 成员时的性能,因为整个存档都用 gz 压缩,并且可能需要在内存中提取所有内容才能访问存档成员。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-08
    相关资源
    最近更新 更多