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
你需要打包一个目录下的所有文件(包括子目录)到压缩文件中去,压缩的方法可以使用流行的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