截至版本0.3.1,我的
ratarmount 模块可以用于在 Python 中挂载 .tar.gz 文件,您可以使用它或查看其源代码。gzip 寻址支持来自依赖项
indexed_gzip。Ratarmount 本身基于
tarindexer,它实现了使用 tarfile 获取偏移量,然后进行寻址的想法。但是,ratarmount 添加了 FUSE 层以及其他可用性和性能功能。您可以从 PyPI 安装 ratarmount。
pip3 install --user ratarmount
然后可以直接从Python调用其命令行界面,如下所示:
import ratarmount
ratarmount.cli( [ '--help' ] )
ratarmount.cli( [ pathToTar, pathToMountPoint ] )
该模块的核心是您已经猜到的
tarfile,它用于迭代所有TarInfo对象并创建一个文件路径、偏移量、大小列表,然后可以使用该列表直接寻找原始tar文件中的偏移量,然后简单地读取下一个大小字节。这是因为TAR格式如此简单。
以下是未经优化和非常基本的核心思想:
import sys
import tarfile
from indexed_gzip import IndexedGzipFile
targzfile = sys.argv[1]
filetoprint = sys.argv[2]
index = {}
file = IndexedGzipFile( targzfile )
for tarinfo in tarfile.open( fileobj = file, mode = 'r|' ):
index[tarinfo.name] = ( tarinfo.offset_data, tarinfo.size )
file.seek( index[filetoprint][0] )
sys.stdout.buffer.write( file.read( index[filetoprint][1] ) )
以上示例已经测试通过,可以正常工作:
wget -O- 'https://ftp.mozilla.org/pub/firefox/releases/70.0/linux-x86_64/en-US/firefox-70.0.tar.bz2' | bzip2 -d -c | gzip > firefox.tgz
python3 minimal-example.py firefox.tgz firefox/updater.ini
tarfile
也可能足够。 - njzk2tarfile
。这是一个嵌套的 tar 文件吗? - Dan Getztarfile
访问存档文件,然后使用fusepy
创建文件系统。 - Johannes PTarFile.extractfile()
将文件读入内存不足以满足你的需求吗? - Dan Getz