Python gzip
モジュールは、その情報へのアクセスを提供しません。
ソースコードは今までそれを保存することなく、それをスキップ:
if flag & FNAME:
# Read and discard a null-terminated string containing the filename
while True:
s = self.fileobj.read(1)
if not s or s=='\000':
break
ファイル名のコンポーネントは、コマンドラインgzip -c
減圧オプションその場合、元のファイル名のSANを.gz
を使用する(存在することが保証されない、任意であり、おもう)。圧縮されていないファイルサイズはヘッダーに格納されません。代わりに最後の4バイトで見つけることができます。
ヘッダーファイルからファイル名を読み取るには、ファイルヘッダーの読み取りコードを再作成する必要があります。には、ファイル名のバイトが代わりに保持されます。
import struct
from gzip import FEXTRA, FNAME
def read_gzip_info(gzipfile):
gf = gzipfile.fileobj
pos = gf.tell()
# Read archive size
gf.seek(-4, 2)
size = struct.unpack('<I', gf.read())[0]
gf.seek(0)
magic = gf.read(2)
if magic != '\037\213':
raise IOError('Not a gzipped file')
method, flag, mtime = struct.unpack("<BBIxx", gf.read(8))
if not flag & FNAME:
# Not stored in the header, use the filename sans .gz
gf.seek(pos)
fname = gzipfile.name
if fname.endswith('.gz'):
fname = fname[:-3]
return fname, size
if flag & FEXTRA:
# Read & discard the extra field, if present
gf.read(struct.unpack("<H", gf.read(2)))
# Read a null-terminated string containing the filename
fname = []
while True:
s = gf.read(1)
if not s or s=='\000':
break
fname.append(s)
gf.seek(pos)
return ''.join(fname), size
作成済みgzip.GzipFile
オブジェクトと上記の関数を使用します:
filename, size = read_gzip_info(gzipfileobj)
gzipでは、単一のファイルを圧縮することができます。あなたはgzipped tarアーカイブを持っていますか? –
私はgzファイルを持っていますが、アーカイブに含まれているファイルとそのサイズを知る必要があります。このgzファイルには –
というpcapファイルがあります –