如何仅提取.tar.gz成员的文件?

hao

我的目标是解压缩.tar.gz文件,而不是解压缩导致文件的子目录。

我的代码基于此问题,除了.zip打开.tar.gz文件外,我没有打开文件。

我问这个问题是因为我得到的错误非常模糊并且无法在我的代码中识别出问题:

import os
import shutil
import tarfile

with tarfile.open('RTLog_20150425T152948.gz', 'r:gz') as tar:
    for member in tar.getmembers():
        filename = os.path.basename(member.name)
        if not filename:
            continue

        # copy file (taken from zipfile's extract)
        source = member
        target = open(os.path.join(os.getcwd(), filename), "wb")
        with source, target:
            shutil.copyfileobj(source, target)

如您所见,我从链接的问题中复制了代码,并尝试将其更改为处理.tar.gz成员而不是.zip成员。运行代码后,出现以下错误:

Traceback (most recent call last):
  File "C:\Users\dzhao\Desktop\123456\444444\blah.py", line 27, in <module>
    with source, target:
AttributeError: __exit__

从我完成的阅读中,shutil.copyfileobj将两个“类似于文件”的对象作为输入。member是一个TarInfo对象。我不确定TarInfo对象是否是类似文件的对象,因此我尝试从以下位置更改此行:

source = member #to
source = open(os.path.join(os.getcwd(), member.name), 'rb')

但这可以理解为引发了一个错误,即找不到文件。

我不明白什么?

西蒙·柯斯滕

这段代码对我有用:

import os
import shutil
import tarfile

with tarfile.open(fname, "r|*") as tar:
    counter = 0

    for member in tar:
        if member.isfile():
            filename = os.path.basename(member.name)
            if filename != "myfile": # do your check
                continue

            with open("output.file", "wb") as output: 
                shutil.copyfileobj(tar.fileobj, output, member.size)

            break # got our file

        counter += 1
        if counter % 1000 == 0:
            tar.members = [] # free ram... yes we have to do this manually

但是您的问题可能不是提取,而是您的文件确实不是.tar.gz,而只是.gz文件。

编辑:也是您在with上收到错误,因为python试图调用__enter__成员对象函数(不存在)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章