设为首页 收藏本站
查看: 800|回复: 0

[经验分享] python tarfile模块

[复制链接]

尚未签到

发表于 2015-12-15 11:59:05 | 显示全部楼层 |阅读模式
下使用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代码   DSC0000.png
    #!/usr/bin/env /usr/local/bin/python
  
  •    # encoding: utf-8  
  •    import tarfile  
  •    import os  
  •    import time  
  •     
  •    start = time.time()  
  •    tar=tarfile.open('/path/to/your.tar,'w')  
  •    for root,dir,files in os.walk('/path/to/dir/'):  
  •            for file in files:  
  •                    fullpath=os.path.join(root,file)  
  •                    tar.add(fullpath,arcname=file)  
  •    tar.close()  
  •    print time.time()-start  




    tar解包
    tar解包也可以根据不同压缩格式来解压。
    Python代码  
      #!/usr/bin/env /usr/local/bin/python  
    •    # encoding: utf-8  
    •    import tarfile  
    •    import time  
    •     
    •    start = time.time()  
    •    t = tarfile.open("/path/to/your.tar", "r:")  
    •    t.extractall(path = '/path/to/extractdir/')  
    •    t.close()  
    •    print time.time()-start  


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

    Python代码  

    •   tar = tarfile.open(filename, 'r:gz')  
    •   for tar_info in tar:  
    •       file = tar.extractfile(tar_info)  
    •       do_something_with(file)  


  • 运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
    2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
    3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
    4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
    5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
    6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
    7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
    8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

    所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-151493-1-1.html 上篇帖子: python的接口实现zope.interface示例 下篇帖子: python核心编程--笔记 (转)
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    扫码加入运维网微信交流群X

    扫码加入运维网微信交流群

    扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

    扫描微信二维码查看详情

    客服E-mail:kefu@iyunv.com 客服QQ:1061981298


    QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


    提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


    本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



    合作伙伴: 青云cloud

    快速回复 返回顶部 返回列表