问题描述
我有一些以字节为单位的tar数据,并且希望在不将其写入文件系统的情况下读取它。
将其写入文件系统可以正常工作
with open('out.tar','wb') as f:
f.write(data)
然后,在外壳中:tar -xzvf out.tar
但是出现以下错误:
import tarfile
tarfile.open(data,'r')
'''
File ".../lib/python3.7/tarfile.py",line 1591,in open
return func(name,filemode,fileobj,**kwargs)
File ".../lib/python3.7/tarfile.py",line 1638,in gzopen
fileobj = gzip.GzipFile(name,mode + "b",compresslevel,fileobj)
File ".../lib/python3.7/gzip.py",line 163,in __init__
fileobj = self.myfileobj = builtins.open(fil
'''
什么是读取内存中tar的正确方法?
更新
以下作品:
from io import BytesIO
tarfile.open(fileobj=BytesIO(data),'r')
为什么?
tarfile.open
应该能够使用字节。我自己将字节转换为类似文件的对象,然后告诉tarfile.open
使用类似文件的对象有效,但是为什么需要进行转换?原始的基于字节的API什么时候起作用,什么时候不起作用?
解决方法
您可以使用tarfile,然后可以从其中使用Byte流读取数据。
import tarfile
with tarfile.open(fileobj = BytesIO(your_file_name)) as tar:
for tar_file in tar:
if (tar_file.isfile()):
inner_data = tar.extractfile(tar_file).read().decode('utf-8')