如何将我的 .tar.gz 文件转换为 shutil.copyfileobj 的类文件对象?
How do I to turn my .tar.gz file into a file-like object for shutil.copyfileobj?
我的目标是从 .tar.gz
文件中提取文件,而不提取所需文件之前的子目录。我正在尝试将我的方法从我自己的这个 question. I already asked a 模块化,但我认为可行的答案似乎没有完全起作用。
简而言之,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)
returns1564197
。
我解决这个问题的尝试没有成功。 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\Desktop34564444\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 中的文件内容?
fileobj
不是 TarFile
的记录 属性。它可能是一个内部对象,用于表示整个 tar 文件,而不是特定于当前文件的对象。
使用TarFile.extractfile()
获取特定成员的类文件对象:
…
source = tar.extractfile(member)
target = open("out", "wb")
shutil.copyfile(source, target)
我的目标是从 .tar.gz
文件中提取文件,而不提取所需文件之前的子目录。我正在尝试将我的方法从我自己的这个 question. I already asked a
简而言之,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)
returns1564197
。
我解决这个问题的尝试没有成功。 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\Desktop34564444\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 中的文件内容?
fileobj
不是 TarFile
的记录 属性。它可能是一个内部对象,用于表示整个 tar 文件,而不是特定于当前文件的对象。
使用TarFile.extractfile()
获取特定成员的类文件对象:
…
source = tar.extractfile(member)
target = open("out", "wb")
shutil.copyfile(source, target)