2007-07-16

 

Python Cookbook 2.11 打包目录树中的文件到压缩文件

需求:

你需要打包一个目录下的所有文件(包括子目录)到压缩文件中去,压缩的方法可以使用流行的gzip方法或者压缩比更高的bzip2方法.

讨论:

Python标准库中的tarfile模块就支持上述的两种方式:你只需要指出自己需要的方法,将它做为参数传递给tarfile.TarFile.open方法即可 ,如:

import tarfile, os
def make_tar(folder_to_backup, dest_folder, compression='bz2'):
    if compression:
        dest_ext = '.' + compression
    else:
        dest_ext = ''
    arcname = os.path.basename(folder_to_backup)
    dest_name = '%s.tar%s' % (arcname, dest_ext)
    dest_path = os.path.join(dest_folder, dest_name)
    if compression:
        dest_cmp = ':' + compression
    else:
        dest_cmp = ''
    out = tarfile.TarFile.open(dest_path, 'w'+dest_cmp)
    out.add(folder_to_backup, arcname)
    out.close( )
    return dest_path

你也可以传递'gz'做为open的第二个参数,来使用gzip方式压缩文件,而非默认的bzip2方式,或者传递''从而不使用任何压缩方式.生成文件的扩展名是通过tarfile.TarFile.open的第二个参数来决定的,可以是.tar,.tar.gz,或者.tar.bz2,对应的参数为:'w','w:gz'和'w:bz2'.
除了open之外,类tarfile.TarFile也提供了其它的类方法,你可以使用适合的来生成实例.我认为open是最方便的,因为它使用open的模式参数来表示压缩方式,当然,如果你希望无条件的使用bz2方法,也可以使用bz2open来代替.
一旦我们拥有了tarfile.TarFile的实例,并且设置了适当的压缩方式,剩下的工作都可以交给add方法来完成.在实际中,如果fold_to_backup是一个目录,而不是一个特定的文件, add会递归添加该目录下所有的文件.有些情况下,我们想控制添加的方式,可以传递给add第二个参数recursive=False来关掉递归方式.当add完成后,make_tar方法剩下的工作就是关闭文件,和返回压缩后文件的路径,这样是为了给调用者更多的信息.

相关说明:

open(cls, name=None, mode='r', fileobj=None, bufsize=10240) method of __builtin__.type instance
    Open a tar archive for reading, writing or appending. Return
    an appropriate TarFile class.

    mode:
    'r' or 'r:*' open for reading with transparent compression
    'r:'         open for reading exclusively uncompressed
    'r:gz'       open for reading with gzip compression
    'r:bz2'      open for reading with bzip2 compression
    'a' or 'a:'  open for appending
    'w' or 'w:'  open for writing without compression
    'w:gz'       open for writing with gzip compression
    'w:bz2'      open for writing with bzip2 compression

    'r|*'        open a stream of tar blocks with transparent compression
    'r|'         open an uncompressed stream of tar blocks for reading
    'r|gz'       open a gzip compressed stream of tar blocks
    'r|bz2'      open a bzip2 compressed stream of tar blocks
    'w|'         open an uncompressed stream for writing
    'w|gz'       open a gzip compressed stream for writing
    'w|bz2'      open a bzip2 compressed stream for writing

Comments: 发表评论



<< Home

This page is powered by Blogger. Isn't yours?