文档章节

学Python的一些记录(二)

Kit_lee
 Kit_lee
发布于 2017/04/26 12:57
字数 1663
阅读 50
收藏 0

昨天为了运维的事情写了人生中第一个python脚本,感觉还是不错的,学一门语言就应该这样,找个目标写点什么,学习起来没有那么枯燥

好吧,废话不多说,自动删除temp文件是做到了,但数据盘也会有空间问题,尤其是测试服务器下的那些在运行的tomcat服务,由于日志级别都是debug,每天就一两百兆的日志文件,放久了数据盘也是会一样被日志塞满磁盘空间。

所以这段python的脚本目前需要改进的需求有两个:

  1. 多个维护目录的配置
  2. 日志类型的目录不宜删除所有日志,要能删除超过一定时间的日志

解决这些需求,我的想法是读配置文件,在不需要更改脚本代码的情况下根据配置文件的设置自动执行维护处理。至于日志类文件要有区别的删除,基本实现逻辑是读取文件的文件属性,例如创建时间,然后根据创建时间与当前时间计算,删除超出某个时间范围的文件

 

一、模块化

为了保持程序简洁易懂,以及可复用性,我将配置文件的读取单独写了一个py,然后在主程序import进来。百度了一个python关于配置文件的信息,找到了configparser的包,可以读取ini配置文件。先来看一下配置文件

[临时目录]
path=c:\Windows\Temp
type=temp

[tomcat1日志]
path=D:\websoft\tomcat8-platform\logs
type=logger
retention=10

[tomcat2日志]
path=D:\websoft\tomcat8-work\logs
type=logger
retention=10

"[]" 中括号包住的是section,理解就是一个个分组的配置,然后将多个维护的文件夹写到配置里边,path是目录地址,type是说明临时文件夹或是日志类型的文件夹,retention则是日志类型文件保留多少天内的文件

然后是新增的readconfig.py的内容

# coding=utf-8
# 读配置文件
import configparser


# 读取配置文件,传入的参数是文件地址
def read_config(configfile):
    config = configparser.ConfigParser()
    config.read(configfile)
    sections = config.sections()
    # 多组目录配置放到一个集合里边
    configs = []
    # 循环读取每一组配置
    for sec in sections:
        conf = None
        try:
            _path = config.get(sec, "path")
            _typ = config.get(sec, "type")
            # 如果是logger类型的目录,会有retention参数,代表保留的天数
            if "logger" == _typ:
                _ret = config.get(sec, "retention")
                conf = {"name": sec, "path": _path, "type": _typ, "retention": _ret}
            else:
                conf = {"name": sec, "path": _path, "type": _typ}
            configs.append(conf)
        except KeyError as ex:
            print(ex)
            pass
    return configs

为了写这个模块,掉了许多坑,后边会详细描述一下,然后是主程序application.py

# coding=utf-8
import os
import time
import readconfig

# 1天的秒数
oneday = 86400
# 当前时间
now = time.time()


# main方法
def main():
    # 读配置
    configs = readconfig.read_config('./config')
    for conf in configs:
        if 'temp' == conf['type']:
            del_temp_files(conf)
        else:
            del_logger_files(conf)


# 清空windows temp目录
def del_temp_files(conf):
    for root, subdirs, files in os.walk(conf['path']):
        for filename in files:
            print('正在删除文件:' + filename)
            try:
                # os.path.join是将路径与文件名合并,得到一个完整的文件地址
                os.remove(os.path.join(root, filename))
            except OSError:
                print('文件:' + filename + '被占用中,删除失败')


# 删除日志目录文件
def del_logger_files(conf):
    for root, subdirs, files in os.walk(conf['path']):
        for filename in files:
            # 使用os.stat的API获取文件属性
            stat = os.stat(os.path.join(root, filename))
            # 获取文件属性中的文件创建时间
            ctime = stat.st_ctime
            # 读取配置里的保留天数
            ret = int(conf['retention'])
            # 创建时间与当前时间相隔秒数
            diff = now - ctime
            # 计算保留天数的时间值
            checktime = ret * oneday
            print('文件'+filename+'的创建时间为:'+time.strftime('%Y-%m-%d', time.localtime(ctime)))
            if diff >= checktime:
                try:
                    print('大于当前时间' + ret + '天,需要删除')
                    os.remove(os.path.join(root, filename))
                except OSError:
                    print('文件:' + filename + '被占用中,删除失败')

if __name__ == '__main__':
    main()

 

坑1-面向对象编程:

因为一直以来写的是java,用熟悉的OOP编程概念,readconfig.py的read_config方法返回的配置内容我会写一个POJO类对配置信息进行封装,所以,我又多写了一个叫ConfigModel的类,像这样子

class ConfigModel:
    
    # 构造方法,传个名称
    def __init__(self, name):
        self.__name = name
        self.__path = None
        self.__type = None
        self.__retention = None

    # 然后是自己熟悉的get set方法
    def get_name(self):
        return self.__name

    def set_name(self, name):
        self.__name = name

    # 不详细写完...

在readconfig.py里我把类引入进来 from ConfigModel import * ,通过一set方法成功将数据set到这个实体类里边,再add到config集合里边,return返回

这时候我在另一边主程序application.py里调用read_config('./config'),再print()一下返回的内容,的确是ConfigModel类,如下面的显示

[readconfig.ConfigModel, xxxxxxxxxxxx]

但在for循环得到对象后无论如何我调用不到这个对象的get方法(IDE里没提示),搞了我半天,各种方法如暴露成属性的@property注解也用了,还是不行。

最后只好使用推荐的字典(dictionary)对象封装返回(一种key--value格式的对象,见上边readconfig.py的代码,按我的理解,不就是json吗?)

 

坑2-文件编码与版本问题

搞定了一个样例,放另外事台windows机器(python 2.7)上跑,发现说无法识别文件编码,要求指定。这在之前另一台正在跑上一个版本代码的机器(python 3.6) 完全没问题,只能百度了一下,给各py文件头部添加了一行关于编码的注释 # coding=utf-8

接着跑,发现说readconfig.py里无法找到configparser包,按网上的例子,将他改为大小写陀峰格式ConfigParser后跑成功了,估计也是版本问题,在3.6里IDE提示的就是小写的包,按网上写的反而报错

 

坑3-变量类型

之前我们知道python里定义变量无需指定变量类型,变量在赋值时自动指定了类型,这种习惯让我以为像javascript一样,变量在跟其他类型变量执行运算时会自动转换。于是,在application.py里算时间值的时候,从conf['retention']拿到的值一直没注意是一个字符串,当我的脚本执行到 checktime = ret * oneday的时候,程序卡死。调试了好久,某次程序终于响应,返回一大堆1010101010信息,我才发现,是不是因为ret是一个字符串,在执行乘法时,不像javascript一样自动强转类型进行运算,而是将一个字符串乘以这么多次相加拼成一个非常大的字符串=. =   最后通过int(ret['retention'])强转后解决

© 著作权归作者所有

共有 人打赏支持
Kit_lee

Kit_lee

粉丝 10
博文 3
码字总数 4447
作品 0
广州
技术主管
私信 提问
Python从基础的几个发展方向

Python入门 Python 编程语言咋入门,我总是遇见很多人问这个问题,听很多人说在网上买了一本书,看了一些视频,但是感觉学的不好,而且进度慢,走了很多弯路。有句话说是方法不对,怎么努力都...

_小迷糊
2018/07/28
0
0
分享我自己写的一套Python爬虫学习经验

最近在学习Python爬虫,感觉非常有意思,真的让生活可以方便很多。学习过程中我把一些学习的笔记总结下来,还记录了一些自己实际写的一些小爬虫,在这里跟大家一同分享,希望对Python爬虫感兴...

崔庆才
2015/02/23
3.7K
25
Python基础到精通几个发展方向

Python入门 Python 编程语言咋入门,我总是遇见很多人问这个问题,听很多人说在网上买了一本书,看了一些视频,但是感觉学的不好,而且进度慢,走了很多弯路。有句话说是方法不对,怎么努力都...

_小迷糊
2018/07/28
0
0
Kaggle实战之sklearn学习

今天刚刚接触python机器学习之kaggle实战这本书,初步学习了python机器学习库之sklearn的基本运用,照葫芦画瓢的对书中代码进行了一定的编写运行,小小记录我学机器学习之路 主要是这对支持向...

silencehhh
2018/04/17
0
0
pythoner求带走

本人二本应届毕业,大一开始学习python,我把python作为我的主要语言,应付一般的开发任务完全没有问题。大二开始使用ubuntu,linux的各种常用命令拿来就用,sed和vim也不生疏。平时喜欢玩一...

万里谁能驯
2014/07/04
516
4

没有更多内容

加载失败,请刷新页面

加载更多

Map的遍历方式

import java.util.*; public class a_21 { public static void main(String[] args) { Map<Integer,Integer> map= new HashMap<Integer, Integer>(); for(int i=0;i<6;i++) ......

南桥北木
23分钟前
0
0
总结:线程间频繁切换为什么耗费资源?

因为线程切换的时候,CPU需要将此线程的所有执行状态保存起来,如线程编号,执行到的位置等,然后再去执行其它线程。

浮躁的码农
54分钟前
3
0
PHP版本高于5.5时,curl文件上传必须使用CurlFile对象

坑了我一天,之前@的方法各种上传不成功文件。都怀疑服务端有bug了。

叫我哀木涕
55分钟前
1
0
js算法总结

数列求和 等差数列求和 function sum(a0,d,n){//a0->首项,d->公差,n->项数//(首项+末项)*项数/2return (a0+(a0+(n-1)*d))*n/2;} 等比数列求和 function sum(a0,q,n){//a0->首项,q......

祖达
今天
3
0
小白?转型?毕业生?外行学习快速入行大数据开发指南

这篇文章中,本文将针对三种不同的、想要进入数据科学领域的人群,给出自己的经验,帮助他们迅速有效入行。 虽然没有适合每个人的万能解决方案,但这三类建议值得想转行的你一看。 第1类:新...

董黎明
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部