用Python透明地挂载tar.gz存档

2024-09-30 22:22:15 发布

您现在位置:Python中文网/ 问答频道 /正文

如何安装a焦油gz用Python透明地归档?

我有一个焦油gz其内容必须由外部程序读取的档案。内容将只是暂时需要。我可以把它解压到一个临时文件夹中,然后把我的外部程序指向那里来读取它。之后,我可以再次删除临时文件夹。但是,归档文件可能很大(提取时大于1 GB),因此解包会占用磁盘上的大量空间。我的服务器在HD性能方面是相当弱的,我不能浪费空间,但它确实有大量的RAM和CPU的能力。在

这就是为什么我想尝试透明地装载归档而不完全解包。我遇到了archivemount它似乎正是我想要的。有没有一种方法可以实现archivemount在纯Python中所做的事情?否subprocess.call请说“解决方案”。它应该在64位Linux上运行。在

我认为应该有一种聪明的方法,使用tarfile访问存档的内容,然后使用fusepy创建一个用户空间文件系统来公开存档的内容。有人已经把这些碎片拼在一起了吗?有什么想法吗?在

如果你认为这不是一个好主意,请发表相关评论。如果你知道什么更好,请评论。在


Tags: 方法程序服务器文件夹内容评论空间档案
1条回答
网友
1楼 · 发布于 2024-09-30 22:22:15

从我的ratarmount模块的0.3.1版本起,您可以使用它或查看它的源代码来装载。焦油gz在Python中。gzip寻求支持来自依赖项indexed_gzip。ratormount本身是基于tarindexer,它实现了使用tarfile获取偏移量然后进行查找的思想。但是,ratamount在其他可用性和性能特性中添加了一个融合层。在

您可以从PyPI安装ratamount:

pip3 install  user ratarmount

然后直接从python调用其命令行接口,如下所示:

^{pr2}$

该模块的核心是您已经推测的tarfile,它用于迭代所有TarInfo对象并创建一个filepath、offset、size的列表,然后可以使用该列表直接查找原始tar文件中的偏移量,并简单地读取下一个大小字节。这是因为TAR格式非常简单。在

以下是未经优化且非常赤裸裸的核心理念:

import sys
import tarfile
from indexed_gzip import IndexedGzipFile

targzfile = sys.argv[1]
filetoprint = sys.argv[2]

index = {} # path : ( offset, size )

file = IndexedGzipFile( targzfile )
for tarinfo in tarfile.open( fileobj = file, mode = 'r|' ):
    index[tarinfo.name] = ( tarinfo.offset_data, tarinfo.size )

# at this point you could save or load the index for faster consecutive file seeks

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

相关问题 更多 >