Python日志打包并压缩文件夹
站内关联
最终版本
[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札记 -- 文件压缩]