如何将.tar.gz文件转换为shutil.copyfileobj的类文件对象?

时间:2016-06-10 20:51:03

标签: python python-3.x gzip tar shutil

我的目标是从.tar.gz文件中提取文件,而不会提取出所需文件之前的子目录。我试图将我的方法模块化为question。我已经问过question我自己的https://docs.djangoproject.com/en/1.9/ref/contrib/admin/但似乎我认为可行的答案没有完全发挥作用。

简而言之,shutil.copyfileobj不会复制我文件的内容。

我的代码现在是:

import os
import shutil
import tarfile
import gzip

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

        source = tar.fileobj
        target = open('out', "wb")
        shutil.copyfileobj(source, target)

运行此代码后,文件out已成功创建,但文件为空。我知道我想要提取的这个文件实际上有很多信息(大约450 kb)。 print(member.size)返回1564197

我试图解决这个问题是不成功的。 print(type(tar.fileobj))告诉我tar.fileobj<gzip _io.BufferedReader name='RTLog_20150425T152948.gz' 0x3669710>

因此,我尝试将source更改为:source = gzip.open(tar.fileobj),但这引发了以下错误:

Traceback (most recent call last):
  File "C:\Users\dzhao\Desktop\123456\444444\blah.py", line 15, in <module>
    shutil.copyfileobj(source, target)
  File "C:\Python34\lib\shutil.py", line 67, in copyfileobj
    buf = fsrc.read(length)
  File "C:\Python34\lib\gzip.py", line 365, in read
    if not self._read(readsize):
  File "C:\Python34\lib\gzip.py", line 433, in _read
    if not self._read_gzip_header():
  File "C:\Python34\lib\gzip.py", line 297, in _read_gzip_header
    raise OSError('Not a gzipped file')
OSError: Not a gzipped file

为什么shutil.copyfileobj实际上没有复制.tar.gz中文件的内容?

1 个答案:

答案 0 :(得分:2)

fileobj不是TarFile的文档属性。它可能是一个内部对象,用于表示整个tar文件,而不是特定于当前文件的内容。

使用TarFile.extractfile()为特定成员获取类似文件的对象:

…
source = tar.extractfile(member)
target = open("out", "wb")
shutil.copyfile(source, target)