5.7 读写压缩文件¶
问题¶
ä½ æƒ³è¯»å†™ä¸€ä¸ªgzip或bz2æ ¼å¼�的压缩文件。
解决方案¶
gzip 和 bz2 模��以很容易的处�这些文件。
两个模�都为 open() 函数�供了�外的实现�解决这个问题。
比如,为了以文本形å¼�读å�–压缩文件,å�¯ä»¥è¿™æ ·å�šï¼š
# gzip compression
import gzip
with gzip.open('somefile.gz', 'rt') as f:
text = f.read()
# bz2 compression
import bz2
with bz2.open('somefile.bz2', 'rt') as f:
text = f.read()
类似的,为了写入压缩数æ�®ï¼Œå�¯ä»¥è¿™æ ·å�šï¼š
# gzip compression
import gzip
with gzip.open('somefile.gz', 'wt') as f:
f.write(text)
# bz2 compression
import bz2
with bz2.open('somefile.bz2', 'wt') as f:
f.write(text)
如上,所有的I/Oæ“�作都使用文本模å¼�并执行Unicode的编ç �/è§£ç �。
ç±»ä¼¼çš„ï¼Œå¦‚æžœä½ æƒ³æ“�作二进制数æ�®ï¼Œä½¿ç”¨ rb 或者 wb 文件模å¼�å�³å�¯ã€‚
讨论¶
大部分情况下读写压缩数æ�®éƒ½æ˜¯å¾ˆç®€å�•的。但是è¦�注æ„�的是选择一个æ£ç¡®çš„æ–‡ä»¶æ¨¡å¼�是é�žå¸¸é‡�è¦�的。
å¦‚æžœä½ ä¸�指定模å¼�,那么默认的就是二进制模å¼�,如果这时候程åº�想è¦�接å�—的是文本数æ�®ï¼Œé‚£ä¹ˆå°±ä¼šå‡ºé”™ã€‚
gzip.open() å’Œ bz2.open() 接å�—跟内置的 open() å‡½æ•°ä¸€æ ·çš„å�‚数,
包括 encoding,errors,newline ç‰ç‰ã€‚
当写入压缩数æ�®æ—¶ï¼Œå�¯ä»¥ä½¿ç”¨ compresslevel 这个å�¯é€‰çš„关键å—å�‚æ•°æ�¥æŒ‡å®šä¸€ä¸ªåŽ‹ç¼©çº§åˆ«ã€‚æ¯”å¦‚ï¼š
with gzip.open('somefile.gz', 'wt', compresslevel=5) as f:
f.write(text)
默认的ç‰çº§æ˜¯9,也是最高的压缩ç‰çº§ã€‚ç‰çº§è¶Šä½Žæ€§èƒ½è¶Šå¥½ï¼Œä½†æ˜¯æ•°æ�®åŽ‹ç¼©ç¨‹åº¦ä¹Ÿè¶Šä½Žã€‚
最�一点, gzip.open() 和 bz2.open() 还有一个很少被知�的特性,
它们å�¯ä»¥ä½œç”¨åœ¨ä¸€ä¸ªå·²å˜åœ¨å¹¶ä»¥äºŒè¿›åˆ¶æ¨¡å¼�打开的文件上。比如,下é�¢ä»£ç �是å�¯è¡Œçš„:
import gzip
f = open('somefile.gz', 'rb')
with gzip.open(f, 'rt') as g:
text = g.read()
è¿™æ ·å°±å…�许 gzip å’Œ bz2 模å�—å�¯ä»¥å·¥ä½œåœ¨è®¸å¤šç±»æ–‡ä»¶å¯¹è±¡ä¸Šï¼Œæ¯”如套接å—,管é�“和内å˜ä¸æ–‡ä»¶ç‰ã€‚