python 常用模块

常用模块

  • time
  • datetime
  • logging
  • platform
  • os 
  • sys
  • subprocess
  • re
  • shutil
  • json
  • pickle
  • random
  • hashlib
  • configparser 
  • rediscluster

 

time 模块

import time

# 时间戳
print(time.time())
1492504530.6282418

# 线程指定推迟时间运行(单位是秒)
time.sleep(5)

# 年月日
print(time.strftime("%Y%m%d", time.localtime()))
20170418

# 相当于linux下的date
print(time.asctime())
Tue Apr 18 16:35:30 2017
print(time.ctime())
Tue Apr 18 16:35:30 2017

# 返回本地时间 的struct time对象格式
print(time.localtime())
time.struct_time(tm_year=2017, tm_mon=4, tm_mday=18, tm_hour=16, tm_min=31, tm_sec=34, tm_wday=1, tm_yday=108, tm_isdst=0)

# 用法,可以单独的把数据读出来支持列表方式和命名方式
stime = time.localtime()
print(stime.tm_year, stime.tm_mday, stime[5])
2017 18 30

 datetime 模块

import datetime

print(datetime.datetime.now())
2017-04-18 16:35:30.629241

 #当前时间+3天
print(datetime.datetime.now() + datetime.timedelta(3))

#当前时间-3天
print(datetime.datetime.now() + datetime.timedelta(-3)) 

#当前时间+3小时
print(datetime.datetime.now() + datetime.timedelta(hours=3)) 

#当前时间+30分
print(datetime.datetime.now() + datetime.timedelta(minutes=30)) 

 

logging 模块

之前有需求记录日志都是自己写用拼凑的方式再写入到文件里,那样没有效率很低,而且格式也是固定;使用logging模块可以快速解决这种需求

logging一共有5个级别: debug, info, warning, error, critical

 输出到屏幕

import logging

logging.debug("user [cuix] hh,you has been debug!")
logging.info("user [cuix] he,you has been info!")
logging.warning("user [cuix] hello,you has been warning!")
logging.error("user [cuix] hi,you has been error!")
logging.critical("user [cuix] ha,you has been critical!!!")

#输出,默认显示warning级别以上的,而debug,info不显示
WARNING:root:user [cuix] hello,you has been warning!
ERROR:root:user [cuix] hi,you has been error!
CRITICAL:root:user [cuix] ha,you has been critical!!!

  

 写入到文件

import logging

# 把需要的级别日志往文件中写入,设置级别为warning以下的写入文件中
# logging.basicConfig(filename='test.log', level=logging.WARNING)

# 加上时间
logging.basicConfig(filename='test.log',
                    format='%(asctime)s %(message)s %(filename)s-%(lineno)d',
                    datefmt='%m/%d/%Y %I:%M:%S %p')

logging.debug("user [cuix] hh,you has been debug!")
logging.info("user [cuix] he,you has been info!")
logging.warning("user [cuix] hello,you has been warning!")
logging.error("user [cuix] hi,you has been error!")
logging.critical("user [cuix] ha,you has been critical!!!")

 设置日志格式 format

%(name)s               Logger的名字
%(levelno)s            数字形式的日志级别
%(levelname)s          文本形式的日志级别
%(pathname)s           调用日志输出函数的模块的完整路径名,可能没有
%(filename)s           调用日志输出函数的模块的文件名
%(module)s             调用日志输出函数的模块名
%(funcName)s           调用日志输出函数的函数名
%(lineno)d             调用日志输出函数的语句所在的代码行
%(created)f            当前时间,用UNIX标准的表示时间的浮 点数表示
%(relativeCreated)d    输出日志信息时的,自Logger创建以 来的毫秒数
%(asctime)s            字符串形式的当前时间。默认格式是 “2003-07-08 16:49:45,896”。逗号后面的是毫秒
%(thread)d             线程ID
%(threadName)s         线程名
%(process)d            进程ID
%(message)s            用户输出的消息

 来个屌的,日志截断

import time
from logging import handlers

logger = logging.getLogger(__name__)
log_file = 'time.log'

# 以大小为单位截断日志(日志文件的末尾为跟数字)
#fh = handlers.RotatingFileHandler(filename=log_file, maxBytes=8, backupCount=3)

# 以时间为单位截断日志 S(秒) D(天) H(小时) M(分) W(星期) midnight(凌晨) interval是时间间隔, backupCount是备份的次数
# 日志末尾会跟时间,以-为分割
fh = handlers.TimedRotatingFileHandler(filename=log_file, when="S", interval=3, backupCount=3)

formatter = logging.Formatter('%(asctime)s %(module)s %(lineno)s %(message)s')
fh.setFormatter(formatter)
logger.addHandler(fh)

logger.warning("user [cuix] hello,you has been warning!")
logger.warning("user [123] hello,you has been warning!")
time.sleep(3)
logger.warning("user [32323] hello,you has been warning!")
logger.error("user [cuix] hi,you has been error!")
time.sleep(3)
logger.critical("user [cuix] ha,you has been critical!!!")
logger.warning("user [32323] hello,you has been warning!")
logger.warning("user [32323] hello,you has been warning!")

 

platform 模块

>>> import platform

# 系统内核及版本
>>> platform.platform()
'Linux-3.10.0-327.28.3.el7.x86_64-x86_64-with-centos-7.2.1511-Core'

# 系统的类型
>>> platform.system()
'Linux'

#系统的hostname
>>> platform.node()
'localhost.localdomain'

# 系统内核信息
>>> platform.release()
'3.10.0-327.28.3.el7.x86_64'

# 系统的架构
>>> platform.machine()
'x86_64'

# 系统信息
>>> platform.uname()
('Linux', 'localhost.localdomain', '3.10.0-327.28.3.el7.x86_64', '#1 SMP Thu Aug 18 19:05:49 UTC 2016', 'x86_64', 'x86_64')

# python 版本
>>> platform.python_version()
'3.5.2'

# 执行系统的命令
>>> platform.popen('ls').read()

# 系统类型及版本号
>>> platform.linux_distribution()
('CentOS Linux', '7.2.1511', 'Core')

  

os 模块

import os 

# 查看系统路径
os.path
# 执行系统命令
os.system('ls')
# 获取当前工作目录,即当前python脚本工作的目录路径
os.getcwd() 
# 删除一个文件,需要指定文件名
os.remove('test.txt')
# 创建一个目录
os.mkdir('dirname')
# 删除一个目录
os.rmdir('dirname')
# 修改文件名或目录
os.rename('oldname','newname')
# 切换路径
os.chdir('path')
# 列出所有文件,以列表形式显示
os.listdir('dirname')
# 返回path规范化的绝对路径
os.path.abspath('path') 
# 将path分割成目录和文件名二元组返回
os.path.split('path')  
# 返回path的目录。其实就是os.path.split(path)的第一个元素
os.path.dirname('path') 
# 返回path最后的文件名。如何path以/或\结尾,那么就会返回空值。即os.path.split(path)的第二个元素
os.path.basename('path')
#  如果path存在,返回True;如果path不存在,返回False
os.path.exists('path')
# 如果path是绝对路径,返回True
os.path.isabs('path') 
#  如果path是一个存在的文件,返回True。否则返回False
os.path.isfile('path')  
# 如果path是一个存在的目录,则返回True。否则返回False
os.path.join(path1[, path2[, ...]])  将多个路径组合后返回,第一个绝对路径之前的参数将被忽略
os.path.isdir('path') 
# 返回path所指向的文件或者目录的最后存取时间
os.path.getatime('path') 
#  返回path所指向的文件或者目录的最后修改时间
os.path.getmtime('path')  

路径拼接(经常用)

import os

# 获取项目的根路径
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))

# 拼接路径(下面是切换到项目根目录下的db/admin的路径下)
os.path.join(BASE_DIR,'db','admin'

程序中还经常对一些文件或者目录判断是否存在进行操作

import os

os.path.isfile('test.txt') #如果不存在就返回False
os.path.exists(directory) #如果目录不存在就返回False

# 如下判断,目录是否存在,若不存在则创建
if os.path.exist('/dirctory') is False:
    os.mkdir('dirctory', 0755)

 获取文件的状态等各种信息

import os

>>> os.stat('socket_server.py')
posix.stat_result(st_mode=33188, st_ino=404720296, st_dev=64771L, st_nlink=1, st_uid=0, st_gid=0, st_size=961, st_atime=1493623080, st_mtime=1493623079, st_ctime=1493623079)

# 文件的大小
>>> os.stat('socket_server.py').st_size
961

  

sys 模块  

# 命令行参数List,第一个元素是程序本身路径
sys.argv  
sys.argv[1]   # 表示传入的第一个参数
# 退出程序,正常退出时exit(0)         
sys.exit(n)  
# 获取Python解释程序的版本信息      
sys.version    
#  最大的Int值
sys.maxint  
# 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
sys.path     
# 返回操作系统平台名称   
sys.platform    
# 增加环境路径
sys.path.append('path')

# 经常会这样用,实现不同目录间的程序调用
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)

 

re 正则

 

subprocess 模块

# 调用系统命令

import subprocess

# getstatusoutput 会有返回执行结果的返回值和执行结果
# 如果返回值为 0  表示执行成功
status = subprocess.getstatusoutput('ls')
if status[0] != 0:
    print('命令执行有异常!')

# getoutput 返回执行命令的结果,不管是否执行成功都会把结果返回
out_put =  subprocess.getoutput(('ls')
print(out_put)

# 还有其它用法,不过我觉得上面这两个就已经能满足需求了,而且用起来比下面的方便
# check_call 
# call
import subprocess

result = subprocess.Popen("cmd", shell=True, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
result.stdin.write("yes\rnn")  
result.stdin.flush()
subprocess 与程序交互

 

  

 

shutil 模块 (文件复制)

import shutil

# copy文件复制
shutil.copy('源文件名', '复制后的文件名')
# copyfile 也是用于文件的复制
shutil.copyfile('源文件名', '复制后的文件名')

# chown 给目录或者文件增加权限
shutil.chown('path', 'user', 'group')

# copystat 复制文件的mtime,ctime,atime值到一个文件上
shutil.copystat('源文件', '需要存在的目标文件')

# move 把源文件移动到指定的文件
shutil.move('源文件', '目标文件')
 
# copytree copymode 这两种用法很少用,可以自行补脑

 

json 模块

import json

dic = {'a': 1, 'b': 2, 'c': 3}

# 把字典写入文件中
with open('json.txt', 'w') as f:
    f.write(json.dumps(dic))

# 从文件中读出写入的字典数据
with open('json.txt') as f:
    new_dic = json.load(f) 
    print(new_dic)
# 执行结果:
{'a': 1, 'b': 2, 'c': 3}

pickle 模块

import pickle

dic = {
    'a': 11,
    'b': 33,
    'c': 222
       }

# 把数据写入到文件,python3需要使用wb
pickle.dump(dic, open('test.log', 'wb'))

# 从文件中把数据读出来,python3需要使用rb
obj = pickle.load(open('test.log', 'rb'))
print(obj)

  

random 模块

import random

# randrange 随机数是1-9而不会是10
>> print(random.randrange(1, 10))
# randint 随机数是1-10 包括10
>> print(random.randint(1, 10))
# 是一个内在地址
>> print(random.random)
# 随机从一个列表中获取元素
>> random.choice(list)

 

hashlib 模块

# 生成根据时间的md5
import hashlib
import time

# 对字符串进行加密
hash = hashlib.md5()
hash.update(b'abc')
print(hash.hexdigest())

# 生成根据时间的md5
hash = hashlib.md5()
hash.update(bytes(str(time.time()), encoding='utf-8'))
print(hash.hexdigest())

   md5 sha1 sha256 sha384 sha512 加密

# md5 加密
m = hashlib.md5()
print(m.hexdigest())

# sha1 加密
m = hashlib.sha1()
m.update('admin'.encode('utf-8'))
print(m.hexdigest())

# sha256 加密
m = hashlib.sha256()
m.update('admin'.encode('utf-8'))
print(m.hexdigest())

# sha384 加密
m = hashlib.sha384()
m.update('admin'.encode('utf-8'))
print(m.hexdigest())

# sha512 加密
# m = hashlib.sha512()
m.update('admin'.encode('utf-8'))
print(m.hexdigest())

  

configparser 模块 (配置文件)

直接上程序来说明比较清楚

# @Time    : 2017/4/18 15:31
# @Author  : Cui X
# @File    : configparser_mod.py


import configparser


class Config(object):
    """置文件操作"""

    def __init__(self, sections, prices):
        self.sections = sections
        self.prices = prices

    # 生成配置文件模板
    @classmethod
    def config_create(cls):
        config = configparser.ConfigParser()
        config["db"] = {'db_host': '192.168.1.1',
                        'db_port': '3306',
                        'db_user': 'root',
                        'db_pass': 'password'}
        # 两种写法,上面是一种,下面是一种
        config['concurrent'] = {}
        config['concurrent']['thread'] = '200'
        config['concurrent']['processor'] = '400'
        config.write(open('test.conf', 'w'))
    # 把数据读出来
    @classmethod
    def config_read(cls):
        conf = configparser.ConfigParser()
        conf.read('test.conf')
        return conf

    # 判断数据是否在存在文件中
    def config_judge(self):
        config = self.config_read()
        if self.sections in config.sections():
            if self.prices in config[self.sections]:
                return True
            else:
                return False
        else:
            return False

    # 增加
    def config_add(self, price):
        if self.config_judge() is False:
            config = self.config_read()
            if self.sections in config.sections():
                config[self.sections][self.prices] = price
                config.write(open('test.conf', 'w'))
                print('数据写入成功')
            else:
                print('%s 不存在' % self.sections)
        else:
            print('数据已存在')

    def config_delete(self):
        if self.config_judge() is True:
            config = self.config_read()
            del config[self.sections][self.prices]
            config.write(open('test.conf', 'w'))
            print('数据删除成功')
        else:
            print('删除的值不存在')

    # 修改配置
    def config_change(self, price):
        if self.config_judge() is True:
            config = self.config_read()
            config[self.sections][self.prices] = price
            config.write(open('test.txt', 'w'))
            print('%s %s 修改成功' % (self.sections, self.prices))

    # 查询配置
    def config_select(self):
        if self.config_judge() is True:
            config = self.config_read()
            select = config[self.sections][self.prices]
            print(select)

    @classmethod
    def show_sections_all(cls):
        config = cls.config_read()
        for s in config.sections():
            print('[%s]' % s)
            for pr in config.options(s):
                print(pr, ' = ', config[s][pr])


if __name__ == '__main__':
    print("""\033[32;1m
    (0) 初始化配置文件
    (1) 增加配置
    (2) 删除配置
    (3) 修改配置
    (4) 查询配置
    (5) 查看所有配置\033[0m
    """)
    while True:
        choose = input('选择操作项 >> ').strip()
        if choose.isdigit():
            choose = int(choose)
            if choose < 5 and choose > 0:
                section = input('sections >> ').strip()
                item = input('item >> ').strip()
                conf = Config(section, item)
                if choose == 1:
                    price = input('add item_price >> ').strip()
                    conf.config_add(price)
                elif choose == 2:
                    conf.config_delete()
                elif choose == 3:
                    price = input('change item_price >> ').strip()
                    conf.config_change(price)
                else:
                    conf.config_select()
            elif choose == 0:
                affirm = input('yes/no ? >> ').strip()
                if affirm == 'yes':
                    Config.config_create()
                    print('\033[32;1m配置文件初始化成功\033[0m')
                else:
                    print('\033[31;1m已取消操作\033[0m')
            elif choose == 5:
                Config.show_sections_all()
            else:
                print('\033[31;1m没有此项目\033[0m')
        else:
            print('\033[31;1m请正确输入\033[0m')
使用面向对象实现配置文件的增删改查

 

rediscluster

import threading
from rediscluster import StrictRedisCluster
from rediscluster import RedisCluster


REDIS_NODES=[
           {'host':'192.168.56.208','port':7000},
           {'host':'192.168.56.208','port':7001},
           {'host':'192.168.56.209','port':7002},
            ]


def cluster_conn():
    conn = RedisCluster(startup_nodes=REDIS_NODES, decode_responses=True)
    return conn


def redis_insert():
    conn = cluster_conn()
    for i in range(200000):
        #conn.delete(i)                         # 删除key
        conn.set(i,'WWWWWWWW')       # 添加key

if __name__ == '__main__':
    for i in range(10):
        INSERT = threading.Thread(target=redis_insert)
        INSERT.start()

 

posted on 2017-03-20 11:33  奋斗德路  阅读(138)  评论(0编辑  收藏  举报