如何在不提取所有内容的情况下访问gzip压缩文件夹的子文件夹中的文件?

时间:2020-07-23 23:26:51

标签: python gzip large-files os.walk tarfile

通过SSH服务器,我可以访问数据集。此数据集分为几个文件,每个文件名为File1.xml.gzFile2.xml.gz等。...这些文件的命名在两种方面有点误导:

  1. 由于它是文件夹,所以我假设它严格来说是.tar.gz文件,但是从名称上并不明显(它只显示.gz)。

  2. 解压缩它们时,不会直接得到File1.xml等,但是它们都包含第一个(子)文件夹(没有其他内容),而后者又包含第二个子文件夹( (别无其他),这是第三个子文件夹(别无其他),最后一个包含第四个子文件夹,其中File1.xml(无别的地方)位于

    我已经在文件夹结构的图片中对此进行了草绘:

    visualization of the folder structure

    正是我要访问的最低级别的文件。

我的问题: 我不允许删除(显然是多余的)文件夹,并且服务器上几乎没有剩余空间,并且文件非常大,所以我不能只是打开它们的包装。因此,我想逐行读取文件的内容。

我想我知道如何找到嵌入在多个子文件夹中的文件:

for root, dirs, files in os.walk(directory, topdown=False):
    for file in files:
        if file.startswith('file') and file.endswith('.xml'):
            # do something with file

而且我知道如何在不显式解压缩的情况下读取压缩文件:

with gzip.open('path to file1.xml.gz', 'rt', encoding='utf-8') as file1:
    for line in file1:
        print(line)

但是要访问压缩文件夹的子子文件夹中的文件吗?有可能吗?

1 个答案:

答案 0 :(得分:4)

使用tarfile,以模式"r|gz"打开。使用next()直到找到所需的内容,然后对该成员使用extractfile()返回可以读取的缓冲流。

>>> import tarfile
>>> t = tarfile.open("file.gz","r|gz")
>>> t.next()
<TarInfo 'a' at 0x1044d3b38>
>>> t.next()
<TarInfo 'a/b' at 0x1044d39a8>
>>> t.next()
<TarInfo 'a/b/c' at 0x1044d38e0>
>>> t.next()
<TarInfo 'a/b/c/d' at 0x1044d3a70>
>>> m = t.next()
>>> m.name
'a/b/c/d/file'
>>> f = t.extractfile(m)
>>> f.readline()
b'this\n'
>>> f.readline()
b'is\n'
>>> f.readline()
b'a\n'
>>> f.readline()
b'test\n'
>>> f.readline()
b''
相关问题