从python中的tar存档中提取压缩的gz文件

Posted

技术标签:

【中文标题】从python中的tar存档中提取压缩的gz文件【英文标题】:Extracting compressed gz file from tar archive in python 【发布时间】:2019-09-27 03:38:28 【问题描述】:

我正在尝试使用 Python 3.6.5 从 tar 存档中提取压缩文件。

我正在尝试从包含压缩 gz 文件的 tar 存档中提取文件。我已经听从了this *** 的建议:

import tarfile,os
import sys
tar = tarfile.open("arXiv_src_9107_001a.tar")
n = 0
for member in tar.getmembers():
    #Skip directory labeled at the top
    if(n==0):
        n=1
        continue
    f=tar.extractfile(member)
    print(member)
    content=f.read()
    print(" has  newlines".format(member, content.count("\n")))
    print(" has  spaces".format(member, content.count(" ")))
    print(" has  characters".format(member, len(content)))
    #sys.exit()
tar.close()

当我在pdb 中打印出vars(tar)

(Pdb) p vars(tar)
'mode': 'r', '_mode': 'rb', '_extfileobj': False, 'name': '/Users/user/Downloads/arXiv_src_9107_001a.tar', 'fileobj': <_io.BufferedReader name='arXiv_src_9107_001a.tar'>, 'errors': 'surrogateescape', 'pax_headers': , 'copybufsize': None, 'closed': False, 'members': [<TarInfo '9107' at 0x11004b048>, <TarInfo '9107/hep-lat9107001.gz' at 0x11004b110>, <TarInfo '9107/hep-lat9107002.gz' at 0x11004b1d8>, <TarInfo '9107/qc_01.gz' at 0x11004b2a0>, <TarInfo '9107/qc_02.gz' at 0x11004b368>, <TarInfo '9107/qi_01.gz' at 0x11004b430>, <TarInfo '9107/qs_01.gz' at 0x11004b4f8>, <TarInfo '9107/quant_only_01.gz' at 0x11004b5c0>], '_loaded': True, 'offset': 69120, 'inodes': , 'firstmember': None

如果我打印出content 变量,我会得到一个字节对象。例如。 :

b'\x1f\x8b\x08\x08\xe5C\x12M\x00\x03hep-lat9107001\x00\xedw\xdbF\x92\xef\xfc\x1b|\x8a\xbe\xf72\x13i#R\x00\x08\xf0\x91\x8c\xf7\x1c?c\xcf\xc6\x8f\xb5\x9d\xc9\xeeZN\x06"!\tc\x92\xe0\x10\xa0d\x85W\xf9\xec\xf...

问题

如果 tar 存档由单独压缩的文件组成,我如何将这些 gz 文件读取/解压缩为可用的人类语言字符串?

【问题讨论】:

导入 gzip;展开 = gzip.decompress(内容) 这似乎行得通。你想这样回答吗? 【参考方案1】:

你可以使用gzip.decompress:

import tarfile, os, gzip
import sys
tar = tarfile.open("arXiv_src_9107_001a.tar")
n = 0
for member in tar.getmembers():
    #Skip directory labeled at the top
    if(n==0):
        n=1
        continue
    f=tar.extractfile(member)
    print(member)
    content=f.read()
    expanded = gzip.decompress(content)
    # do whatever with expanded here
tar.close()

【讨论】:

以上是关于从python中的tar存档中提取压缩的gz文件的主要内容,如果未能解决你的问题,请参考以下文章

linux压缩命令压缩和提取文件

如何在不解压缩内容的情况下查看 .tar.gz 存档中特定文件的内容?

快速从存档中提取所选文件

解压缩 .gz 文件并将它们存储在 .tar.gz 存档中

bash:仅提取 tar.gz 存档的一部分

学习Linux tar 命令:最简单也最困难