美文网首页
15 Python模块导入与常用模块介绍

15 Python模块导入与常用模块介绍

作者: 代码小小白 | 来源:发表于2020-09-23 11:24 被阅读0次
模块的导入和__name__属性
  • __name__属性:
    ① 当模块(.py文件称为一个模块)以脚本方式运行的时候,该模块的__name__属性是 __main__
    ② 当模块以模块方式被导入时,__name__就是本模块的名字
    针对上面的特性,可以在模块最后加上判断if __name__ == '__main__',判断当前模块是否需要执行,可以在开发过程中调试,被引用的时候就不执行。

  • 模块的导入:
    导入一个模块通常分三步
    ① 查看内存中是否有该模块,如果已经导入的模块会存储在内存中,并且会执行xxx模块中所有的可执行代码
    ② 查看内置路径,一般都在安装Python的路径 Lib下
    ③ sys.path路径中查找,是一个列表,如果模块路径找不到,就无法导入,解决问题的办法就是在sys.path中append模块路径
    注:如果上面都找不到,就报错

  • 绝对路径导入和相对路径导入:
    ① 绝对路径导入:
    import xxx:导入一个模块的所有成员
    import aaa,bbb:一次性导入多个模块的成员。不推荐这种写法,分开写。
    from xxx import a:从某个模块中导入指定的成员。
    from xxx import a,b,c:从某个模块中导入多个成员。
    from xxx import *:从模块中导入所有成员。

    • import xxx 和 from xxx import * 的区别:
      第一种方式在使用其中成员时,必须使用模块名作为前缀。不容易产生命名冲突。
      第二种方式在使用其中成员时,不用使用模块名作为前缀,直接使用成员名即可。但是容易产生命名冲突。在后定义的成员生效(把前面的覆盖了。)

      如何避免冲突:给模块取别名 from xxx import age as a
      如何避免from xxx import *时候将不愿意暴露的成员暴露,可以在模块中增加__all__,该列表表示可以被外界使用的成员,例如在模块xxx中,添加__all__ = [a, b],外界引用的成员只有a和b,__all__也仅对from xxx import *有效

    ② 相对路径导入:
    格式:from 相对路径 import xxx
    相对路径:包含了点号的一个相对路径。
    . 表示的是当前的路径。
    ..表示的是父路径。
    ...表示的是父路径的父路径。
    依次类推。。。

常用模块
random
time
datetime
os sys
json:

用于网络传输序列化(dumps)和反序列化(loads),不包含btye类型

pickle:

用于网络传输序列化(dumps)和反序列化(loads),和json的区别是,他只适用于python语言中,包含byte类型,并且是直接将对象转化成byte类型,json多了一步先转成特殊的字符串

hashlib:
# 普通加密
import hashlib
data = "你好"
data1 = "小白"
ret = hashlib.md5() #创建一个加密的对象
ret.update(data.encode('utf-8')) # 加密的对象必须转成byte类型,也可以多个update
ret.update(data1.encode('utf-8')) 
ret.hexdigest() # 接收加密结果

#加盐 因为目前MD5已经可以被撞库破解,需要更复杂点加密
# 固定加盐
ret1 = hashlib.md5("加盐".encode('utf-8'))  #创建一个加密的对象,“加盐”可以是任意一个秘钥
ret1.update(data.encode('utf-8')) 
ret1.hexdigest() # 接收加密结果

# 动态加盐
ret2 = hashlib.md5("123456"[0:2].encode('utf-8'))  # 可以通过切片等方式加盐
ret2.update(data.encode('utf-8'))
ret2.update(data1.encode('utf-8'))
ret2.hexdigest() # 接收加密结果

# sha系列  金融类,安全类.用这个级别.
# 随着sha系列数字越高,加密越复杂,越不易破解,但是耗时越长.
ret3 = hashlib.sha256()
ret3.update(data.encode('utf-8'))
ret3.update(data1.encode('utf-8'))
ret3.hexdigest() # 接收加密结果

#校验文件的完整性
def file_md5(path):
    ret = hashlib.sha256()
    with open(path,mode='rb') as f1: # 必须以byte类型读取文件
        b1 = f1.read()
        # print(b1)
        ret.update(b1)
    return ret.hexdigest()
result = file_md5('pycharm-professional-2019.1.2.exe')
print(result)
collections
re: 详见19
shutil

shutil是一个强大的python处理文件的库
① 复制:shutil.copy("源文件","目标文件")
② 复制2:shutil.copy2("源文件","目标文件")
区别是 copy2复制后的结果保留了原来的所有信息(包括状态信息)
③ shutil.copytree("源目录", "目标目录", ignore=shutil.ignore_patterns("init.py","sag"))
ignore 是忽略文件夹中的一些文件,可以不传
④ 删除文件夹及文件:shutil.rmtree("目标目录")
(删除文件用 os.unlink(path))
⑤ 移动文件:shutil.move("源文件", "目标目录", copy_function=shutil.copy2)
⑥ 查看磁盘使用空间:
total, used, free = shutil.disk_usage("c:\")
print("当前磁盘共: %iGB, 已使用: %iGB, 剩余: %iGB"%(total / 1073741824, used / 1073741824, free / 1073741824))
⑦ 压缩文件:
shutil.make_archive('压缩后文件的名字', "zip", "源文件")
⑧ 解压缩文件:
shutil.unpack_archive("压缩文件","解压后的路径")

logging

主要掌握4个知识点
① logging模块基本的配置
② 同时在屏幕和文件上输出,并解决乱码问题
③ 日志的切割
④ pythonjsonlogger 模块

import logging

# 第一种配置方法 config配置
fh = logging.FileHandler('tmp.log', encoding='utf-8') # 往文件写
sh = logging.StreamHandler() # 屏幕输出
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s - %(message)s',
                    datefmt='%Y-%m-%d %H:%M:%S %p',
                    handlers = [fh, sh]
                     )

# 输出内容是有等级的 : 默认处理warning级别以上的所有信息
logging.debug('debug message')          # 调试
logging.info('info message')            # 信息
logging.warning('warning message')      # 警告
logging.error('error message')          # 错误
logging.critical('critical message')    # 批判性的
# 第二种配置方法 logger对象配置
logger = logging.getLogger() # 创建logger对象
logger.setLevel(logging.DEBUG)
fm = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(fm)
sh.setFormatte(fm)

logger.addHandler(fh)
logger.addHandler(sh)

logger.critical('日志信息')

日志切割与删除就是为了防止文件过大,占用计算机内存
*按天分割日志

import logging
import logging.handlers
import os
import time

# 如果日志文件夹不存在,则创建
log_dir = "log-day"  # 日志存放文件夹名称
log_path = os.getcwd() + os.sep + log_dir
if not os.path.isdir(log_path):
    os.makedirs(log_path)
 
# logging初始化工作
logging.basicConfig()
 
# myapp的初始化工作
myapp = logging.getLogger('myapp')
myapp.setLevel(logging.INFO)
 
# 添加TimedRotatingFileHandler
# 定义一个1天换一次log文件的handler
# 保留3个旧log文件
timefilehandler = logging.handlers.TimedRotatingFileHandler(
    log_dir + os.sep + "sec.log",
    when='D',
    interval=1,
    backupCount=3
)
# 设置后缀名称,跟strftime的格式一样
timefilehandler.suffix = "%Y-%m-%d_%H-%M-%S.log"
# timefilehandler.suffix = "%Y-%m-%d.log"
 
formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s')
timefilehandler.setFormatter(formatter)
myapp.addHandler(timefilehandler)
 
while True:
    time.sleep(6)
    myapp.info("test")

*按照时间回滚(就是按时间分割日志,并且限制日志文件的个数,删除早期的日志)

import time
import logging
import logging.handlers
 
# logging初始化工作
logging.basicConfig()
 
# myapp的初始化工作
myapp = logging.getLogger('myapp')
myapp.setLevel(logging.INFO)
 
# 添加TimedRotatingFileHandler
# 定义一个1秒换一次log文件的handler
# 保留3个旧log文件
timefilehandler = logging.handlers.TimedRotatingFileHandler("log1/myapp.log", when='S', interval=1, backupCount=3)
# 设置后缀名称,跟strftime的格式一样
timefilehandler.suffix = "%Y-%m-%d_%H-%M-%S.log"
 
formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s')
timefilehandler.setFormatter(formatter)
myapp.addHandler(timefilehandler)
 
while True:
    time.sleep(0.1)
    myapp.info("test")

#注意:filehanlder.suffix的格式必须这么写,才能自动删除旧文件,如果设定是天,就必须写成“%Y-%m-%d.log”,写成其他格式会导致删除旧文件不生效。这个配置在源码里能看出来,但是在官方文档并没有说明这一点!!!!!!!!!!

TimedRotatingFileHandler的构造函数定义如下:
TimedRotatingFileHandler(filename [,when [,interval [,backupCount]]])
filename 是输出日志文件名的前缀,比如log/myapp.log
when 是一个字符串的定义如下:
“S”: Seconds
“M”: Minutes
“H”: Hours
“D”: Days
“W”: Week day (0=Monday)
“midnight”: Roll over at midnight
interval 是指等待多少个单位when的时间后,Logger会自动重建文件,当然,这个文件的创建
取决于filename+suffix,若这个文件跟之前的文件有重名,则会自动覆盖掉以前的文件,所以
有些情况suffix要定义的不能因为when而重复。
backupCount 是保留日志个数。默认的0是不会自动删除掉日志。若设3,则在文件的创建过程中
库会判断是否有超过这个3,若超过,则会从最先创建的开始删除。

*按照大小回滚
RotatingFileHandler基于文件大小切分
这个配置是可以生效的,符合预期

import time
# import logging
import logging.handlers
 
# logging初始化工作 
logging.basicConfig()
 
# myapp的初始化工作 
myapp = logging.getLogger('myapp')
myapp.setLevel(logging.INFO)
 
# 写入文件,如果文件超过100个Bytes,仅保留5个文件。 
handler = logging.handlers.RotatingFileHandler(
    'logs/myapp.log', maxBytes=500, backupCount=5)
 
formatter = logging.Formatter('%(asctime)s|%(name)-12s: %(levelname)-8s %(message)s')
handler.setFormatter(formatter)
# 设置后缀名称,跟strftime的格式一样 
myapp.addHandler(handler)
 
while True:
    time.sleep(0.1)
    myapp.info("file test")

pythonjsonlogger模块以json格式输出日志

import logging
from pythonjsonlogger import jsonlogger

logger = logging.getLogger()

ch = logging.StreamHandler()
ch.setFormatter(jsonlogger.JsonFormatter())
logger.setLevel(logging.INFO)  # 默认是warning
logger.addHandler(ch)

logger.info({"special": "value", "run": 12})
logger.info("classic message", extra={"special": "value", "run": 12})
logger.info("asda%s", 123)

'''
{"message": null, "special": "value", "run": 12}
{"message": "classic message", "special": "value", "run": 12}
{"message": "asda123"}

相关文章

  • 15 Python模块导入与常用模块介绍

    模块的导入和__name__属性 __name__属性:① 当模块(.py文件称为一个模块)以脚本方式运行的时候,...

  • python-random模块

    random模块为python内置模块,直接导入即可使用 前提:导入模块 常用函数使用及说明1.random函数:...

  • Python常用模块

    Python常用模块之time模块 Python常用模块之os模块 Python常用模块之sys模块 Python...

  • 浅谈 Python 的模块导入

    浅谈 Python 的模块导入 本文不讨论 Python 的导入机制(底层实现细节),仅讨论模块与包,以及导入语句...

  • Python学习笔记之模块

    本篇主要介绍Python模块和如何将模块导入编程环境中,模块是用来组织代码的方法。 模块(module) 模块支持...

  • python os 模块(1)

    python中导入模块用 import import os #导入os 模块...

  • 关于python导入模块和package的一些深度思考

    背景 在python中有导入模块和导入package一说,这篇文章主要介绍导入模块和package的一些思考。首先...

  • pandas

    Pandas模块是Python用于数据导入及整理的模块 http://yam.gift/2017/02/15/li...

  • PyMoTW-3 python常用模块简介

    PyMoTW介绍python中的常用模块,此文章为PyMoTW下的python3的常用模块学习笔记。 1. Tex...

  • python 小知识点

    50个基本的python命令 01 导入模块 上面三个常用的导入句式, 前两句是把模块连带命名空间导入. 要访问模...

网友评论

      本文标题:15 Python模块导入与常用模块介绍

      本文链接:https://www.haomeiwen.com/subject/duqfsktx.html