python 历史数据删除法则-阿里云开发者社区

开发者社区> 科技小能手> 正文

python 历史数据删除法则

简介:
+关注继续查看

#!/usr/bin/env python

#-*- coding:UTF-8 -*-

"""

@Item   :  database Backup

@Author :  Villiam Sheng

@Date   :  2012-08-13

@Funtion:

 

    

"""

 

import os,sys,time,re,socket,threading,json,base64,traceback,ConfigParser,fcntl,struct

from rsync_log import rsync_log

from rsync_post import rsync_post

from  statvfs import F_BLOCKS,F_BAVAIL,F_BSIZE

 

pcg = 0

""" 生成斐波那契数列"""

lists = []

a,b = 0,1

while b <= 365:

    a,b = b ,a+b

    lists.append(b)

 

 

class rsync_thread(threading.Thread):

    def __init__(self,path):

        threading.Thread.__init__(self)

        self.log = rsync_log()

        self.path = path

 

 

    """ 计算当前磁盘的使用百分比"""

    def disk(self):

        try:

            vfs = os.statvfs(self.path)

            disk_full = int(vfs[F_BLOCKS]*vfs[F_BSIZE]/1024/1024/1024)

            disk_free = int(vfs[F_BAVAIL]*vfs[F_BSIZE]/1024/1024/1024)

            return  '%.1f'%(float(disk_full - disk_free) / disk_full * 100)

        except:

            self.log.log_info('rsync_info.err','dfile.disk',traceback.print_exc())

            return traceback.print_exc()

 

 

    def run(self):

        global pcg

        old_df = []     # 上一年的删除历史文件

        new_df = []     # 今年的删除历史文件

        sf = []         # 保留的历史文件

        res = {}        # 所有文件的天数及文件的路径

        rs = 0          # 删除文件的总和

        size = []       # 获取删除文件的大小

        msize = []      # 今天备份所有文件的大小

        tday_size = []  # 今天备份文件的大小

        ms = 0          # 今天备份文件的总和

        year = time.localtime().tm_year

 

        """ 得到文件的天数,以文件名作为key,天数作为value """

        for root,dirs,files in os.walk(self.path):

            for fpath in files:

                res[os.path.join(root,fpath)] =  time.localtime(os.stat(os.path.join(root,fpath)).st_ctime).tm_yday

 

        """ 判断文件的天数是否符合斐波那契数列,符合条件append到sf列表中,不符合append df列表中 """

        for v,k in  res.items():

            if k in lists:

                sf.append(k)

                self.log.log_info('log_info.save','dfile.rsync_thread','%s:::%s'%(v,k))

            elif k not in lists:

                if year != time.localtime(os.stat(v).st_ctime).tm_year:

                    old_df.append({v:k})

                else:

                    new_df.append({v:k})

            try:

                for s in  range(len(new_df)):

                    for f,k in new_df[s].items():

                        tday_size.append(k)

                if max({}.fromkeys(tday_size).keys()) == k:

                    msize.append(os.path.getsize(f))

            except:

                pass

        c = []

        pcg = float(self.disk())

        """ 判断今天是否有新的文件备份,在删除的列表中删除最后一天的数据,但必须保证磁盘的使用百分比大于等于 %91 """

        if time.localtime().tm_yday in res.values():

            if len(old_df) != 0:

                for s in  range(len(old_df)):

                    for f,k in old_df[s].items():

                        c.append(k)

                for s in  range(len(old_df)):

                    for f,k in old_df[s].items():

                        if min({}.fromkeys(c).keys()) == k and pcg > 91:

                            size.append(os.path.getsize(f))

                            os.system('rm -frv %s' %f)

                            self.log.log_info('log_info.delete','remove cmd','rm -frv %s %s'%(f,k))

                        elif pcg <= 91:

                            break

                        pcg = float(self.disk())

            elif len(new_df) != 0:

                for s in  range(len(new_df)):

                    for f,k in new_df[s].items():

                        c.append(k)

                for s in  range(len(new_df)):

                    for f,k in new_df[s].items():

                        if min({}.fromkeys(c).keys()) == k and pcg > 91:

                            size.append(os.path.getsize(f))

                            os.system('rm -frv %s' %f)

                            self.log.log_info('log_info.delete','remove cmd','rm -frv %s %s'%(f,k))

                        elif pcg <= 91:

                            break

                        pcg = float(self.disk())

            for s in size:

                rs += s

            for m in msize:

                ms += m

            self.log.log_info('log_info.delete','Disk release %s %s MB'%(self.path,rs /1024/1024) ,'Disk append %s %s MB'%(self.path,ms /1024/1024))

        else:

            self.log.log_info('log_info.delete','Disk files ',' %s No update file' %self.path)

            sys.exit()

 

 

class rsync_dfile(object):

    def __init__(self):

 

    def work(self):

        fp =  open('/proc/mounts','r')

        m_info=fp.readlines()

        fp.close()

        data = {}

        sections = []

 

        for i in m_info:

            if i.find('data=ordered') != -1 or  i.find('mfs') != -1 or i.find('nfs') != -1:

                if os.path.ismount(str(i.split()[1])):

                    if str(i.split()[1]) != '/':

                        if str(i.split()[1]) != '/root':

                            if str(i.split()[1]) != '/var':

                                if len(i.split()[1]) != 1:

                                    if not i.find('sunrpc') != -1:

                                        rs_thread = rsync_thread(i.split()[1])

                                        rs_thread.start()

 

 

if __name__ == "__main__":

    rs = rsync_dfile()

    while True:

        rs.work()

        if pcg <= 91:

             break

 

 

 本文转自 swq499809608 51CTO博客,原文链接:http://blog.51cto.com/swq499809608/1128468


版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
利用Python了解微信通信机制,实现查询有多少好友删除你!!
此篇文章参考微信通信机制,收益匪浅!:http://lib.csdn.net/article/wechat/63831 QQ交流群127591054 当然也可以写发送消息的代码,机制和上述文章介绍的一样,大家可以参考学习! 偶遇:偶尔在论坛发现有外国友人在开源社区发布的Python微信删除好友查看,但是这个作者的代码我这边运行出现了点问题,就是各种问题,我在作者基础上进行研究修改!最终在Python2.7成功运行,之后又用了两天时间把运行环境转移到Python3.5。
1580 0
日志服务(SLS)支持历史数据索引重建(Index Rebuild)
日志服务提供索引重建功能,针对历史数据索引未配置、配置错误或遗漏等问题,一步完成对历史数据的索引重构
1349 0
删除 PostgresSql 数据库 报错:有 N 个其它会话正在使用数据库 的解决方案
遇到的问题 在PostgreSQL 9.2 及以上版本,执行下面的语句: postgres=# drop database dbtest; # 执行删除指定数据库的时候,报以下错误 ERROR: database "dbtest" is being accessed by other users DETAIL: There is 2 other session using the database. 或者使用 Navicat 等第三方数据库连接工具,删除指定数据库的时候报错,说明此时有两个客户端在连接此数据库,此时不能删除数据库。
69 0
在GitHub上删除项目后,在Android Studio上传项目依然提示project is already on github
描述: 在GitHub上面上传项目,但是感觉有些问题,就想删除了重新上传。 但是在Android Studio重新上传项目时,遇到了问题,一直提示“project is already on github”   解决方案: 1、关闭Android Studio项目;   2、进入到本地项目目录,找到隐藏文件夹.
1244 0
数据仓库数据模型之:极限存储--历史拉链表
摘要: 在数据仓库的数据模型设计过程中,经常会遇到文内所提到的这样的需求。而历史拉链表,既能满足对历史数据的需求,又能很大程度的节省存储资源。 在数据仓库的数据模型设计过程中,经常会遇到这样的需求:1. 数据量比较大;2. 表中的部分字段会被update,如用户的地址,产品的描述信息,订单的状态等等;3. 需要查看某一个时间点或者时间段的历史快照信息,比如,查看某一个订单在历史某一个时间点的
4358 0
RDS for MySQL 通过分区自动归档历史数据
RDS for MySQL 通过分区归档历史数据 原始表 分区 用于分区维护的存储过程 每月调用存储过程的事件 随着数据的积累,数据量的增加,越来越多的表体积变的庞大,不但影响查询的执行时间,而且使得管理工作(比如添加删除索引)变的越发复杂和困难。本文介绍一个通过分区滑动来归档历史
7631 0
23706
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载