Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1811287
  • 博文数量: 636
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3950
  • 用 户 组: 普通用户
  • 注册时间: 2014-08-06 21:58
个人简介

博客是我工作的好帮手,遇到困难就来博客找资料

文章分类

全部博文(636)

文章存档

2024年(5)

2022年(2)

2021年(4)

2020年(40)

2019年(4)

2018年(78)

2017年(213)

2016年(41)

2015年(183)

2014年(66)

我的朋友

分类: 系统运维

2015-04-03 16:09:27

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代码  收藏代码

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

  2.  # encoding: utf-8  

  3.  import tarfile  

  4.  import os  

  5.  import time  

  6.   

  7.  start = time.time()  

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

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

  10.          for file in files:  

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

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

  13.  tar.close()  

  14.  print time.time()-start  



tar解包

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

Python代码  收藏代码

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

  2.  # encoding: utf-8  

  3.  import tarfile  

  4.  import time  

  5.   

  6.  start = time.time()  

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

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

  9.  t.close()  

  10.  print time.time()-start  

 

 

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

Python代码  收藏代码

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

  2. for tar_info in tar:  

  3.     file = tar.extractfile(tar_info)  

  4.     do_something_with(file)  


阅读(1610) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~