相关文章推荐
小胡子的松鼠  ·  C/C++ 中 static ...·  1 年前    · 
彷徨的哑铃  ·  从SQL Server ...·  1 年前    · 
谦和的蘑菇  ·  Google Apps ...·  1 年前    · 

Python 下使用 tarfile 模块来实现文件归档压缩与解压



1.压缩,创建tar.gz包

#!/usr/bin/env python

import os

import tarfile

#创建压缩包名

tar = tarfile.open("/tmp/tartest.tar.gz","w:gz")

#创建压缩包

for root,dir,files in os.walk("/tmp/tartest"):

for file in files:

fullpath = os.path.join(root,file)

tar.add(fullpath)

tar.close()

2.解压 tar.gz

#!/usr/bin/env python

import tarfile

tar = tarfile.open(“/tmp/tartest.tar.gz”)

names = tar.getnames()

for name in names:

tar.extract(name,path=”/tmp”)

tar.close()






import zipfile


file = zipfile.ZipFile("samples/sample.zip", "r")     # 打开压缩包


# 列出压缩包内文件名

for name in file.namelist():

print name,


# 列出压缩包内文件信息

for info in file.infolist():

print info.filename, info.date_time, info.file_size


sample.txt sample.jpg

sample.txt (1999, 9, 11, 20, 11, 8) 302

sample.jpg (1999, 9, 18, 16, 9, 44) 4762

---------------------------------------------------------

从 ZIP 文件中读取数据

调用 read 方法就可以从 ZIP 文档中读取数据. 它接受一个文件名作为参数, 返回字符串

---------------------------------------------------------

import zipfile


file = zipfile.ZipFile("samples/sample.zip", "r")   # 打开压缩包


for name in file.namelist():               #列出压缩包内文件名称

data = file.read(name)                 # 读取文件到data

print name, len(data), repr(data[:10])        # 输出文件对象数量及内容


sample.txt 302 'We will pe'

sample.jpg 4762 '\377\330\377\340\000\020JFIF'

---------------------------------------------------------

ZIP 文件写入数据

使用 zipfile 模块将文件储存在 ZIP 文件里

向压缩档加入文件很简单, 将文件名, 文件在 ZIP 档中的名称传递给 write 方法即可.

write 方法的第三个可选参数用于控制是否使用压缩.默认为 zipfile.ZIP_STORED , 意味着只是将数据储存在档案里而不进行任何压缩.

如果安装了 zlib 模块, 那么就可以使用 zipfile.ZIP_DEFLATED 进行压缩.

---------------------------------------------------------

import zipfile

import glob, os


file = zipfile.ZipFile("test.zip", "w")     # 打开压缩包,写方式


for name in glob.glob("samples/*"):        # 匹配samples目录下所有文件

file.write(name, os.path.basename(name), zipfile.ZIP_DEFLATED)      #将文件写入到压缩包内


file.close()


file = zipfile.ZipFile("test.zip", "r")

for info in file.infolist():

print info.filename, info.date_time, info.file_size, info.compress_size


sample.wav (1999, 8, 15, 21, 26, 46) 13260 10985

sample.jpg (1999, 9, 18, 16, 9, 44) 4762 4626

sample.au (1999, 7, 18, 20, 57, 34) 1676 1103

...

---------------------------------------------------------

使用 zipfile 模块在 ZIP 文件中储存字符串

---------------------------------------------------------

import zipfile

import glob, os, time


file = zipfile.ZipFile("test.zip", "w")          # 打开压缩包,写方式


now = time.localtime(time.time())[:6]    # 获取当前时间 (2012, 2, 3, 16, 58, 39)


for name in ("life", "of", "brian"):

info = zipfile.ZipInfo(name)

info.date_time = now

info.compress_type = zipfile.ZIP_DEFLATED

file.writestr(info, name*1000)


file.close()


# open the file again, to see what's in it


file = zipfile.ZipFile("test.zip", "r")


for info in file.infolist():

print info.filename, info.date_time, info.file_size, info.compress_size


life (2000, 12, 1, 0, 12, 1) 4000 26

of (2000, 12, 1, 0, 12, 1) 2000 18

brian (2000, 12, 1, 0, 12, 1) 5000 31

---------------------------------------------------------

案例分析

---------------------------------------------------------

import zipfile

z = zipfile.ZipFile(filename, 'r') # 这里的第二个参数用 r表示是读取zip文件,w是创建一个zip文件

for f in z.namelist():

print f

---------------------------------------------------------

import zipfile

z = zipfile.ZipFile(filename, 'r')

for i in z.infolist():

print i.file_size, i.header_offset

---------------------------------------------------------

import zipfile

z = zipfile.ZipFile(filename, 'r')

print z.read(z.namelist()[0])

---------------------------------------------------------

import zipfile, os

z = zipfile.ZipFile(filename, 'w') # 注意这里的第二个参数是w,这里的filename是压缩包的名字

#假设要把一个叫testdir中的文件全部添加到压缩包里(这里只添加一级子目录中的文件):

if os.path.isdir(testdir):

for d in os.listdir(testdir):

z.write(testdir+os.sep+d)

# close() 是必须调用的!

z.close()




tar打包

在写打包代码的过程中,使用tar.add()增加文件时,会把文件本身的路径也加进去,加上arcname就能根据自己的命名规则将文件加入tar包

打包代码:

Python代码 python  tarfile模块_python  tarfile模块

  1. #!/usr/bin/env /usr/local/bin/python

  2. # encoding: utf-8

  3. import tarfile

  4. import os

  5. import time

  6. start = time.time()

  7. tar=tarfile.open( '/path/to/your.tar,' w')

  8. for root,dir,files in os.walk( '/path/to/dir/' ):

  9. for file in files:

  10. fullpath=os.path.join(root,file)

  11. tar.add(fullpath,arcname=file)

  12. tar.close()

  13. print time.time()-start



tar解包

tar解包也可以根据不同压缩格式来解压。

Python代码 python  tarfile模块_python  tarfile模块

  1. #!/usr/bin/env /usr/local/bin/python

  2. # encoding: utf-8

  3. import tarfile

  4. import time

  5. start = time.time()

  6. t = tarfile.open( "/path/to/your.tar" , "r:" )

  7. t.extractall(path = '/path/to/extractdir/' )

  8. t.close()

  9. print time.time()-start

上面的代码是解压所有的,也可以挨个起做不同的处理,但要如果tar包内文件过多,小心内存哦~

Python代码 python  tarfile模块_python  tarfile模块

  1. tar = tarfile.open(filename, 'r:gz' )

  2. for tar_info in tar:

  3. file = tar.extractfile(tar_info)

  4. do_something_with(file)