python压缩/解压gzip 大文件
最近处理线上日志,日志文件刚好是经过压缩的,且是gz后缀。自己便采用gzip库来处理。
示例如下:
创建gzip文件
# -- coding: utf-8 --
import gzip
"""
创建gzip文件
"""
content = """
侠客行
李白 〔唐代〕
赵客缦胡缨,吴钩霜雪明。
银鞍照白马,飒沓如流星。
十步杀一人,千里不留行。
事了拂衣去,深藏身与名。
闲过信陵饮,脱剑膝前横。
将炙啖朱亥,持觞劝侯嬴。
三杯吐然诺,五岳倒为轻。
眼花耳热后,意气素霓生。
救赵挥金槌,邯郸先震惊。
千秋二壮士,烜赫大梁城。
纵死侠骨香,不惭世上英。
谁能书阁下,白首太玄经。
"""
f = gzip.open('xiakexing.txt.gz', 'wb')
f.write(str.encode(content))
f.close()
解压gzip文件
# -- coding: utf-8 --
import gzip
"""
解压gzip文件
"""
f = gzip.open('xiakexing.txt.gz', 'rb')
file_content = f.read().decode('utf-8')
f.close()
print(file_content)
压缩现有gzip文件
# -- coding: utf-8 --
import gzip
"""
gzip压缩现有文件
"""
f_in = open('file.txt', 'rb')
f_out = gzip.open('file.txt.gz', 'wb')
f_out.writelines(f_in)
f_out.close()
f_in.close()
处理大文件
真正在生产可能会存在比较大的文件,直接解压肯定是不行了。可能会报错,例如:
所以可以采用循环处理,加入一定的缓冲机制,例如:
# -- coding: utf-8 --
import gzip
import os
buf_size = 1024 * 8
def gzip_file(src, dst):
fin = open(src, 'rb')
fout = gzip.open(dst, 'wb')
in2out(fin, fout)
def gunzip_file(gz_file, dst):
fin = gzip.open(gz_file, 'rb')
fout = open(dst, 'wb')
in2out(fin, fout)
def in2out(fin, fout):
while True:
buf = fin.read(buf_size)
if len(buf) < 1:
break
fout.write(buf)
fin.close()
fout.close()
再次执行就能看到大文件,正常解压了