Python日志打包并压缩文件夹
docker>Evan2017年8月11日 (五) 10:06的版本 (→最终版本)
最终版本
[root@ mon]# cat tarbz2log.py #!/usr/bin/python #-*- coding:utf-8 -* # 打包并删除原来目录 by evan 20170810 import os, tarfile , shutil , datetime mydate=(datetime.datetime.now() - datetime.timedelta(days=7)).strftime("%Y%m%d") mytarfile=mydate+'.tar.bz2' logdirs=['create','enter','levelup','login','reg','start'] os.chdir("/data/logs/yaklog/") def mymove(src,dest): shutil.move(src,dest) def make_tarbz2(tarname, srcdir): tar=tarfile.open(tarname, 'w:bz2') tar.add(srcdir,arcname=os.path.basename(srcdir)) tar.close() #有时在centos6 上不能用 def make_tarbz20(tarname, srcdir): with tarfile.open(tarname, 'w:bz2') as tar: tar.add(srcdir,arcname=os.path.basename(srcdir)) tar.close() if __name__=="__main__": for log in logdirs: mysrc="/data/logs/yaklog/"+log+'/'+mydate mydest="/data/logs/yaklog/"+log+'_bak' mymove(mysrc,mydest) os.chdir("/data/logs/yaklog/") for log in logdirs: os.chdir("/data/logs/yaklog/"+log+'_bak') #pass make_tarbz2(mytarfile,mydate) if os.path.exists(mytarfile) and os.path.exists(mydate): shutil.rmtree(mydate)
需求
把 create 里面过期的目录迁移到 create_bak并打包压缩 目录例子如下 ls /data/logs/yaklog/create/20170713/ create create_bak
进化过程
文件打包(tarfile模块) tarfile模块用于读写tar归档文件,它也可以同时实现压缩功能。与zipfile模块相比,tarfile模块 可以直接将一个目录进行归档并压缩。另外,tarfile模块提供的api更“面向对象”化。 ##原型 20170810 #!/usr/bin/python #-*- coding:utf-8 -* # 打包并删除原来的原目录 by evan import os, tarfile , shutil , datetime def make_tarbz2(tarname, srcdir): with tarfile.open(tarname, 'w:bz2') as tar: tar.add(srcdir,arcname=os.path.basename(srcdir)) tar.close() mydate=(datetime.datetime.now() - datetime.timedelta(days=2)).strftime("%Y%m%d") mytarfile=mydate+'.tar.bz2' if __name__=="__main__": make_tarbz2(mytarfile,mydate) if os.path.exists(mytarfile) and os.path.exists(mydate): shutil.rmtree(mydate) # logdirs=['create','enter','levelup','login','reg','start'] In [51]: for loop in logdirs: ...: print loop def mymove(src,dest): shut.move(src,dest) os.chdir("/data/logs/yaklog/") 有变量就这样 分离出来就行了 终于聪明了一下下 mysrc="/data/logs/yaklog/"+mydate #解说 知识点一 arcname 在写打包代码的过程中,使用tar.add()增加文件时,会把文件本身的路径也加进去,加上arcname就能根据自己的命名规则将文件加入tar包 知识点二 basename #目录 In [3]: src='/data/mon' In [4]: os.path.basename(src) Out[4]: 'mon' 文件 In [14]: os.path.basename('/data/mon/tarbz2.py') Out[14]: 'tarbz2.py' 知识点四 shutil.rmtree shutil.rmtree('/tmp/myprog2') # 删除一个目录(包括子目录和文件 知识点五 os.path.exists #判断目录和文件都用这个 if not os.path.exists(target_dir): os.makedirs(target_dir, 0755); 知识点六 datetime #前天 import datetime In [3]: (datetime.datetime.now() - datetime.timedelta(days=2)).strftime("%Y%m%d") Out[3]: '20170807' 知识点七 glob In [13]: glob.glob('*.py') Out[13]: ['tarbz2.py'] 知识点八 import os, tarfile #一次性打包整个根目录。空子目录会被打包。 #如果只打包不压缩,将"w:gz"参数改为"w:"或"w"即可。 def make_targz(output_filename, source_dir): with tarfile.open(output_filename, "w:gz") as tar: tar.add(source_dir, arcname=os.path.basename(source_dir)) #逐个添加文件打包,未打包空子目录。可过滤文件。 #如果只打包不压缩,将"w:gz"参数改为"w:"或"w"即可。 def make_targz_one_by_one(output_filename, source_dir): tar = tarfile.open(output_filename,"w:gz") for root,dir,files in os.walk(source_dir): for file in files: pathfile = os.path.join(root, file) tar.add(pathfile) tar.close()
trouble shooting
问题一 AttributeError: 'str' object has no attribute 'open' 原来是自己的命令(tarfile)和系统自己的名字同名了 哈哈 谢谢不死 一开始以为这个呢 tarfile.open(filename 的第一个参数 不能为 str evan@evanpc:~/test$ ./tarbz2.py <type 'module'> 问题二 [root@ mon]# ./tarbz2log.py Traceback (most recent call last): File "./tarbz2log.py", line 31, in <module> make_tarbz2(mytarfile,mydate) File "./tarbz2log.py", line 15, in make_tarbz2 with tarfile.open(tarname, 'w:bz2') as tar: AttributeError: 'TarFile' object has no attribute '__exit__' #在线上报错了 一开始还以为要py2.7呢 最终是 去掉with 语句就好了 改为 tar=open 什么的
参考
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Python之文件与目录操作(os、zipfile、tarfile、shutil)
Python中使用tarfile压缩、解压tar归档文件示例
Python之文件与目录操作(os、zipfile、tarfile、shutil)
with as
http://blog.csdn.net/azhao_dn/article/details/7659276
https://www.ibm.com/developerworks/cn/opensource/os-cn-pythonwith/index.html Statement: with and tarfile
另外的 zip zipfile和tarfile模块 python zipfile模块学习笔记(一) Python压缩和解压缩文件(zip/unzip) [ http://www.cnblogs.com/PandaBamboo/p/3254449.html Python札记 -- 文件压缩]