免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4256 | 回复: 0
打印 上一主题 下一主题

python gzip lib usage [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-06-03 11:28 |只看该作者 |倒序浏览
最简单的读写例子:
来自python 官方document example
import gzip
f = gzip.open('/home/joe/file.txt.gz', 'rb')
file_content = f.read()
f.close(import gzip
content = "Lots of content here"
f = gzip.open('/home/joe/file.txt.gz', 'wb')
f.write(content)
f.close()
import gzip
f_in = open('/home/joe/file.txt', 'rb')
f_out = gzip.open('/home/joe/file.txt.gz', 'wb')
f_out.writelines(f_in)
f_out.close()
f_in.close()
下面是用gzip的GzipFile类的使用方法(from diveintopython):
>>> compresseddata = f.read()                              

>>> len(compresseddata)
6289
>>> import StringIO
>>> compressedstream = StringIO.StringIO(compresseddata)   

>>> import gzip
>>> gzipper = gzip.GzipFile(fileobj=compressedstream)      

>>> data = gzipper.read()                                 

>>> print data                                             

  dive into mark
  
  
>>> len(data)
15955


                     
                     继续上面的例子,f 是一个从 URL 开启器返回的类文件对象。使用它的 read() 方法将正常地获得非压缩数据,但是因为这个数据已经被 gzip 压缩过,所以这只是获得你想要的最终数据的第一步。
                     
                  
                  
                     


                     
                     好吧,只是先得有点儿凌乱的步骤。Python 有一个 gzip 模块,它能读取 (当然也能写入) 磁盘上的 gzip 压缩文件。但是磁盘上还没有文件,只在内存里有一个 gzip 压缩缓冲区,并且你不想仅仅为了解压缩而写出一个临时文件。那么怎么做来从内存数据 (compresseddata) 创建类文件对象呢?这需要使用 StringIO 模块。你首次看到 StringIO 模块是在
上一章
,但现在你会发现它的另一种用法。
                     
                  
                  
                     


                     
                     现在你可以创建 GzipFile 的一个实例,并且告诉它其中的 “文件” 是一个类文件对象 compressedstream。
                     
                  
                  
                     


                     
                     这是做所有工作的一行:从 GzipFile 中 “读取” 将会解压缩数据。感到奇妙吗?是的,它确实解压缩了数据。gzipper 是一个类文件对象,它代表一个 gzip 压缩文件。尽管这个 “文件” 并非一个磁盘上的真实文件;但 gzipper 还是从你用 StringIO 包装了压缩数据的类文件对象中 “读取” 数据,而它仅仅是内存中的变量 compresseddata。压缩的数据来自哪呢?最初你从远程 HTTP 服务器下载它,通过从用 urllib2.build_opener 创建的类文件对象中 “读取”。令人吃惊吧,这就是所有的步骤。链条上的每一步都完全不知道上一步在造假。
                     
                  
                  
                     


                     
                     看看吧,实际的数据 (实际为 15955 bytes)。
下面是gzip的help翻译:
                                       
zlib模块支持提供的数据压缩,兼容GNU压缩程序gzip。此外,gzip模块提供
GzipFile类读写gzip格式文件,自动压缩或解压缩数据,因此类似一个普通文件对象。注意,其他可以被gzip和gunzip解压缩的文件格式,
如由compress和pack产生的压缩文件,不被这个模块支持。
模块定义了如下条例:
class GzipFile([filename[, mode[, compresslevel[, fileobj]]]])
    构造GzipFile类,类似大部分文件对象方法,有readinto()和trancate()方法异常,至少fileobj和filename必须为一个non-trivial的值。
   基于fileobj产生的新类实例可以产生一个规则文件,一个StringIO对象,或任何类似文件的对象。默认是None,此处filename是产生一个文件对象。
   当fileobj是None,filename只能使用包含压缩文件的原始文件的gzip文件头,默认fileobj文件是可识别的,其他,必须默认为空文本,同时原始文件名不比包含文件头。
   mode可以为’r’,’rb’,’a’,’ab’,’w’或‘wb’,依赖文件是否被读或被写。默认可识别的fileobj模式:其他情况下默认是‘rb’,如果没有设定,‘b’标志将被添加到模式保证文件打开二进制模式交叉平台兼容。
   压缩级别参数是一个从1到9的整数,控制压缩级别。1最快,最小压缩,9最慢,最大压缩,默认为9。
   调用GzipFile对象close()方法不会关闭fileobj,由于你可能在压缩数据后添加更多材料。支持传递一个打开的StringIO对象作为fileobj,获取内存缓冲区结果使用StringIO对象的getvalue()方法。
open(filename[, mode[, compresslevel]])
GzipFile的速记方法(filename,mode,compresslevel),参数filename需要,mode默认为’rb’,压缩级别默认为9
See Also:
Module zlib:
基础数据压缩模块需要gzip文件格式
出自:python 2.5手册 12.2 gzip — Support for gzip files
翻译:ubunoon@sina.com
日期:2008-2-13
保留翻译版权!
                               
               
               
               

本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u3/93255/showart_1953200.html
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP