Python日志打包并压缩文件夹

来自linux中国网wiki
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打包文件夹的方法小结(zip,tar,tar.gz等)

Python之文件与目录操作(os、zipfile、tarfile、shutil)

for loop

Python中使用tarfile压缩、解压tar归档文件示例

python tarfile-打包解包

Python打包文件夹(zip/tar/tar.gz)

Shutil模块介绍(有源码讲解)

Python 日期和时间

【python】datetime获取日期,前一天日期

Python之文件与目录操作(os、zipfile、tarfile、shutil)

shutil文件操作

Python判断文件是否存在的三种方法

如何使用tarfile实现目录过滤的打包文件

学习Salt源码智慧之Python信号量

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札记 -- 文件压缩]

python用zipfile模块打包文件或是目录、解压zip文件实例 zipfile 在Python中压缩和解压文件