提取内存文件系统中的Tar文件

弗雷德里克·布(Frederic Bu)

我在使用memoryfs时遇到了麻烦:https : //docs.pyfilesystem.org/en/latest/reference/memoryfs.html

我正在尝试在memoryFS中提取tar,但是我不能使用mem_fs,因为它是一个对象,无法获取真实的/内存路径...

from fs import open_fs, copy
import fs
import tarfile

mem_fs = open_fs('mem://')

print(mem_fs.isempty('.'))

fs.copy.copy_file('//TEST_FS', 'test.tar', mem_fs, 'test.tar')

print(mem_fs.listdir('/'))

with mem_fs.open('test.tar') as tar_file:
    print(tar_file.read())
    tar = tarfile.open(tar_file) // I cant create the tar ...
    tar.extractall(mem_fs + 'Extract_Dir') // Cant extract it too...

有人可以帮我吗,有可能做到吗?

幼虫

的第一个参数tarfile.open是文件名。您(a)向其传递了一个打开的文件对象,并且(b)即使您要传递文件名,tarfile也对内存中文件系统一无所知,因此无法找到该文件。

幸运的是,tarfile.open有一个fileobj参数可以接受打开的文件对象,因此您可以编写:

with mem_fs.open('test.tar', 'rb') as tar_file:
    tar = tarfile.open(fileobj=tar_file)
    t.list()

请注意,您需要以二进制模式(rb打开文件

当然,现在还有第二个问题:虽然可以打开并读取档案,但是该tarfile模块仍然不了解内存中的文件系统,因此尝试提取文件只会将它们提取到本地文件系统中,这很可能是不是你想要的。

要提取到内存中的文件系统中,您需要从tar归档成员中读取数据并自己编写。这是这样做的一种选择:

import fs
import os
import pathlib
import tarfile

mem_fs = fs.open_fs('mem://')
fs.copy.copy_file('/', '{}/example.tar.gz'.format(os.getcwd()),
                  mem_fs, 'example.tar.gz')

with mem_fs.open('example.tar.gz', 'rb') as fd:
    tar = tarfile.open(fileobj=fd)

    # iterate over list of members
    for member in tar.getmembers():

        # if the member is a file
        if member.isfile():

            # create any necessary directories
            p = pathlib.Path(member.path)
            mem_fs.makedirs(str(p.parent), recreate=True)

            # open the archive member
            with mem_fs.open(member.path, 'wb') as memfd, \
                    tar.extractfile(member.path) as tarfd:
                # and write the data into the memory fs
                memfd.write(tarfd.read())

tarfile.TarFile.extractfile方法将打开的文件对象返回到tar存档成员,而不是将文件提取到磁盘。

请注意,如果您使用的是大文件,则上述方法不是最佳解决方案(因为它会在写入之前将整个存档成员读入内存)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TOP 榜单

热门标签

归档