time/datetime/os/sys/json/pickle/hashlib/hmac/logging 模块

Common python module

1, time module

# 时间戳:时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。
time_stamp=time.time()
print(time_stamp,type(time_stamp))  # 1552551519.291029 <class 'float'>


# 格式化时间:格式化的时间字符串(format string):格式化时间表示的是普通的字符串格式的时间。
format_time=time.strftime("%Y-%m-%d %X")  # Y:年份,m:月份,d:日,x:时分秒
print(format_time,type(format_time))  # 2019-08-16 18:34:55 <class 'str'>


# 结构化时间
# 结构化的时间(struct time):struct_time元组共有9个元素共九个元素,分别为(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
print('本地时区的struct_time:\n{}'.format(time.localtime()))
print('UTC时区的struct_time:\n{}'.format(time.gmtime()))

2, datetime module

# datetime模块可以看成是时间加减的模块
import datetime
# 返回当前时间
print(datetime.datetime.now()) # 打印当前时间  2019-08-16 18:53:36.519623
now=datetime.datetime.now()
print(now+datetime.timedelta(3))    # 默认在当前时间加三天  2019-08-19 18:53:36.519623
print(now+datetime.timedelta(hours=4))  # 在当前时间加4小时  2019-08-16 22:53:36.519623
print(now+datetime.timedelta(minutes=45))  # 在当前时间加45分钟  2019-08-16 19:38:36.519623
print(now.replace(hour=8,minute=57,second=38))  # 替换时间,时分秒  2019-08-16 08:57:38.519623

3, os module

os module to interact with the operating system, you can manipulate files

import os
os.getcwd() # 获取当前文件目录

os.mkdir() # 创建一个文件夹

os.rmdir() # 删除文件夹

# 经常用到
os.listdir() # 列出指定文件夹下的所有文件

os.rename()  # 重命名文件

os.remove()  # 删除文件

os.path.abspath(path)  # 返回path(文件名)规范化的绝对路径

os.path.exists(path)  # 如果path存在,返回True;path不存在,返回False

os.path.isfile(path) # 如果path是一个存在的文件,返回True,否则返回False

os.path.isdir(path) # 如果path是一个存在的文件夹,返回True,否则返回False

os.path.join(path1[],path2[])  # 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略,支持不同的平台(windows,ios,andirod,linux,unix)

os.path.dirname(path) # 返回path的父文件夹,其实就是os.path.split(path)的第一个元素

4, sys module

Interact with the python interpreter

import sys
print(sys.path)  # 返回模块的搜索路径,初始化时使用pythonpath环境变量的值

sys.argv   # 接收参数(用cmd执行文件时运行才有效)

sys.modules  # 返回系统导入的模块字段

5, json module

I wrote a program using python, wrote a program in Java, the two programs need to exchange data between the provisions of a multilingual common data types, json string

Serialization: (most common) becomes python json string from the dictionary, dump

Deserialize: from json into python string dictionary (the most common), load

json serialization is not unique to python, json serialization in java and other languages ​​will be involved, so use json serialization can achieve the purpose of cross-platform data transmission.

json data types and data type correspondence table python

Json type Python type
{} dict
[] list
"string" str
520.13 int or float
true/false True/False
null None
import json

dic = {'a': 1, 'b': 'abc', 'c': None}
data = json.dumps(dic)  # 序列化到内存中
print(data,type(data))  # 单引号全部变成双引号  # {"a": 1, "b": "abc", "c": null} <class 'str'>
data = json.loads(data)  # 从内存中获取json串
print(data,type(data))


# 序列化到文件夹中
with open('test.json','w',encoding='utf8') as fw:
    json.dump(dic,fw)

with open(f'{"test"}.json','r',encoding='utf8') as fr:   # 读取出来反序列化
    data = json.load(fr) 
    print(data)

6, pickle module

Python can serialize all objects (data types), but not cross-platform

def func():
    x = 3
    print(x)

import pickle
# 序列化
with open('test.pkl','wb') as fw:   # pickle模块需要使用二进制存储
    pickle.dump(func,fw)
# 反序列化
with open('test.pkl', 'rb') as fr:
    data = pickle.load(fr)
    data()
    print(data)

7, hashlib module

# 密码加密:无论你丢什么字符串,他都会返回一串 固定长度的字符串


import hashlib

m = hashlib.md5()  # 固定的写法
m.update(b'123456')
# m.update(b'456')
print(m.hexdigest())

# 叠加性,先update123再update456的输出结果和update123456结果一样
# 123 456 --》 e10adc3949ba59abbe56e057f20f883e
# 123456 --》 e10adc3949ba59abbe56e057f20f883e

# 1. 变成固定的字符串
# 1. 相同的字符串哈希后结果一样
# 2. 叠加性

8, hmac module

Password encryption, key and within it to create content and then we had some sort of deal with encryption, to note that only accepts binary data encryption

import hmac

m = hmac.new(b'abc')  # 加盐
m.update(b'123456')
# m.update(b'456')
print(m.hexdigest())

# abc 123 456 --> 8c7498982f41b93eb0ce8216b48ba21d
# abc 123456 --> 8c7498982f41b93eb0ce8216b48ba21d

# a 1234556 --》 3e391a1d7bf574cec59679244a2904fe  

# 123456 --> 8c7498982f41b93eb0ce8216b48ba21d

# 123456 --> 8c7498982f41b93eb0ce8216b48ba21d

9, logging module

That log module

# v1
import logging

logging.debug('调试')  # 10
logging.info('正常')   # 20  # 用这一个
logging.critical('严重错误') # 30
logging.error('错误') # 40
logging.warning('警告') # 50
# 默认30以上的可以输出

# v2 日志信息记录在文件当中
logging.basicConfig(filename='access.log',
                    format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',
                    level=10)

logging.debug('调试信息')  # 10
logging.info('正常信息')  # 20
logging.warning('警告信息')  # 30
logging.error('报错信息')  # 40
logging.critical('严重错误信息')  # 50

# v3

# 1. 生成一个logger对象
logger = logging.getLogger('nick')

# 2. 生成格式
formmater1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s:  %(message)s',
                               datefmt='%Y-%m-%d %H:%M:%S %p',)
formmater2 = logging.Formatter('%(asctime)s :  %(message)s',
                               datefmt='%Y-%m-%d %H:%M:%S %p',)
formmater3 = logging.Formatter('%(name)s %(message)s',)

# 3. 生成一个文件对象
h1 = logging.FileHandler('h1.log')
h2 = logging.FileHandler('h2.log')
sm = logging.StreamHandler()


# 4. 文件绑定格式
h1.setFormatter(formmater1)
h2.setFormatter(formmater2)
sm.setFormatter(formmater3)


# 5. 绑定文件
logger.addHandler(h1)
logger.addHandler(h2)
logger.addHandler(sm)

# 6. 控制级别
logger.level = 50

# 7. 使用
logger.debug('调试信息')  # 10
logger.info('正常信息')  # 20
logger.warning('警告信息')  # 30
logger.error('报错信息')  # 40
logger.critical('严重错误信息')  # 50

9.1 Configuring Log Files

You can copy and paste to use

import os
import logging.config

# 定义三种日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
                  '[%(levelname)s][%(message)s]'  # 其中name为getLogger()指定的名字;lineno为调用日志输出函数的语句所在的代码行
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
# 定义日志输出格式 结束

logfile_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))  # log文件的目录,需要自定义文件路径 # atm
logfile_dir = os.path.join(logfile_dir, 'log')  # C:\Users\oldboy\Desktop\atm\log

logfile_name = 'log.log'  # log文件名,需要自定义路径名

# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir):  # C:\Users\oldboy\Desktop\atm\log
    os.mkdir(logfile_dir)

# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name)  # C:\Users\oldboy\Desktop\atm\log\log.log
# 定义日志路径 结束

# log配置字典
LOGGING_DIC = {
    'version': 1,
    'disable_existing_loggers': False,
    'formatters': {
        'standard': {
            'format': standard_format
        },
        'simple': {
            'format': simple_format
        },
    },
    'filters': {},  # filter可以不定义
    'handlers': {
        # 打印到终端的日志
        'console': {
            'level': 'DEBUG',
            'class': 'logging.StreamHandler',  # 打印到屏幕
            'formatter': 'simple'
        },
        # 打印到文件的日志,收集info及以上的日志
        'default': {
            'level': 'INFO',
            'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
            'formatter': 'standard',
            'filename': logfile_path,  # 日志文件
            'maxBytes': 1024 * 1024 * 5,  # 日志大小 5M  (*****)
            'backupCount': 5,
            'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
        },
    },
    'loggers': {
        # logging.getLogger(__name__)拿到的logger配置。如果''设置为固定值logger1,则下次导入必须设置成logging.getLogger('logger1')
        '': {
            # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
            'handlers': ['default', 'console'],
            'level': 'DEBUG',
            'propagate': False,  # 向上(更高level的logger)传递
        },
    },
}


def load_my_logging_cfg():
    logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
    logger = logging.getLogger(__name__)  # 生成一个log实例
    logger.info('It works!')  # 记录该文件的运行状态
    
    return logger


if __name__ == '__main__':
    load_my_logging_cfg()

9.2 log

You can copy and paste to use

import time
import logging
import my_logging  # 导入自定义的logging配置

logger = logging.getLogger(__name__)  # 生成logger实例


def demo():
    logger.debug("start range... time:{}".format(time.time()))
    logger.info("中文测试开始。。。")
    for i in range(10):
        logger.debug("i:{}".format(i))
        time.sleep(0.2)
    else:
        logger.debug("over range... time:{}".format(time.time()))
    logger.info("中文测试结束。。。")


if __name__ == "__main__":
    my_logging.load_my_logging_cfg()  # 在你程序文件的入口加载自定义logging配置
    demo()

Guess you like

Origin www.cnblogs.com/zhuangyl23/p/11366422.html