zoukankan      html  css  js  c++  java
  • python常用模块

    内置模块

    1.序列

    1.1json模块

    json模块是将满足条件的数据结构转化成特殊的字符串,并且也可以反序列化还原回去。

    用于网络传输:dumps、loads

    用于文件写读:dump、load

    dumps、loads

    import json
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    str_dic = json.dumps(dic)  #序列化:将一个字典转换成一个字符串
    print(type(str_dic),str_dic)  #<class 'str'> {"k3": "v3", "k1": "v1", "k2": "v2"}
    #注意,json转换完的字符串类型的字典中的字符串是由""表示的
    
    dic2 = json.loads(str_dic)  #反序列化:将一个字符串格式的字典转换成一个字典
    #注意,要用json的loads功能处理的字符串类型的字典中的字符串必须由""表示
    print(type(dic2),dic2)  #<class 'dict'> {'k1': 'v1', 'k2': 'v2', 'k3': 'v3'}
    
    
    list_dic = [1,['a','b','c'],3,{'k1':'v1','k2':'v2'}]
    str_dic = json.dumps(list_dic) #也可以处理嵌套的数据类型 
    print(type(str_dic),str_dic) #<class 'str'> [1, ["a", "b", "c"], 3, {"k1": "v1", "k2": "v2"}]
    list_dic2 = json.loads(str_dic)
    print(type(list_dic2),list_dic2) #<class 'list'> [1, ['a', 'b', 'c'], 3, {'k1': 'v1', 'k2': 'v2'}]
    

    dump、load

    import json
    f = open('json_file.json','w')
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    json.dump(dic,f)  #dump方法接收一个文件句柄,直接将字典转换成json字符串写入文件
    f.close()
    # json文件也是文件,就是专门存储json字符串的文件。
    f = open('json_file.json')
    dic2 = json.load(f)  #load方法接收一个文件句柄,直接将文件中的json字符串转换成数据结构返回
    f.close()
    print(type(dic2),dic2)
    

    1.2 pickle模块

    pickle模块是将Python所有的数据结构以及对象等转化成bytes类型,然后还可以反序列化还原回去。

    用于网络传输:dumps、loads

    用于文件写读:dump、load

    dumps、loads

    import pickle
    dic = {'k1':'v1','k2':'v2','k3':'v3'}
    str_dic = pickle.dumps(dic)
    print(str_dic)  # bytes类型
    
    dic2 = pickle.loads(str_dic)
    print(dic2)    #字典
    
    # 还可以序列化对象
    import pickle
    
    def func():
        print(666)
        
    ret = pickle.dumps(func)
    print(ret,type(ret))  # b'x80x03c__main__
    func
    qx00.' <class 'bytes'>
    
    f1 = pickle.loads(ret)  # f1得到 func函数的内存地址
    f1()  # 执行func函数
    

    dump、load

    dic = {(1,2):'oldboy',1:True,'set':{1,2,3}}
    f = open('pick序列化',mode='wb')
    pickle.dump(dic,f)
    f.close()
    with open('pick序列化',mode='wb') as f1:
        pickle.dump(dic,f1)
    
    

    2. os模块

    当前执行这个python文件的工作目录相关的工作路径
    os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径  ** 
    os.chdir("dirname")  改变当前脚本工作目录;相当于shell下cd  **
    os.curdir  返回当前目录: ('.')  **
    os.pardir  获取当前目录的父目录字符串名:('..') **
    
    # 和文件夹相关 
    os.makedirs('dirname1/dirname2')    可生成多层递归目录  ***
    os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 ***
    os.mkdir('dirname')    生成单级目录;相当于shell中mkdir dirname ***
    os.rmdir('dirname')    删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname ***
    os.listdir('dirname')    列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 **
    
    # 和文件相关
    os.remove()  删除一个文件  ***
    os.rename("oldname","newname")  重命名文件/目录  ***
    os.stat('path/filename')  获取文件/目录信息 **
    
    os.environ  #获取系统环境变量  **
    
    #path系列,和路径相关
    os.path.abspath(path) #返回path规范化的绝对路径  ***
    os.path.split(path) #将path分割成目录和文件名二元组返回 ***
    os.path.dirname(path) #返回path的目录。其实就是os.path.split(path)的第一个元素  **
    os.path.basename(path) #返回path最后的文件名。如何path以/或结尾,那么就会返回空值,即os.path.split(path)的第二个元素。 **
    os.path.exists(path)  #如果path存在,返回True;如果path不存在,返回False  ***
    os.path.isabs(path)  #如果path是绝对路径,返回True  **
    os.path.isfile(path)  #如果path是一个存在的文件,返回True。否则返回False  ***
    os.path.isdir(path)  #如果path是一个存在的目录,则返回True。否则返回False  ***
    os.path.join(path1,path2,...)  #将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 ***
    os.path.getatime(path)  #返回path所指向的文件或者目录的最后访问时间  **
    os.path.getmtime(path)  #返回path所指向的文件或者目录的最后修改时间  **
    os.path.getsize(path) #返回path的大小 ***
    

    img3. sys模块

    sys.path           #返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值  ***
    
    

    4. hashlib模块

    密码的加密。

    文件一致性校验。

    4.1 密码的加密

    4.1.1 普通加密:
    import hashlib
    
    md5 = hashlib.md5()
    md5.update('123456'.encode('utf-8'))
    print(md5.hexdigest())
    
    # 计算结果如下:
    'e10adc3949ba59abbe56e057f20f883e'
    
    # 验证:相同的bytes数据转化的结果一定相同
    import hashlib
    
    md5 = hashlib.md5()
    md5.update('123456'.encode('utf-8'))
    print(md5.hexdigest())
    
    # 计算结果如下:
    'e10adc3949ba59abbe56e057f20f883e'
    
    # 验证:不相同的bytes数据转化的结果一定不相同
    import hashlib
    
    md5 = hashlib.md5()
    md5.update('12345'.encode('utf-8'))
    print(md5.hexdigest())
    
    # 计算结果如下:
    '827ccb0eea8a706c4c34a16891f84e7b'
    

    4.2 文件的一致性校验

    def file_check(file_path):
        with open(file_path,mode='rb') as f1:
            sha256 = hashlib.sha256()
            while 1:
                content = f1.read(1024)
                if content:
                    sha256.update(content)
                else:
                    return sha256.hexdigest()
    print(file_check('pycharm-professional-2019.1.1.exe'))
    

    5.时间有关的模块

    5.1 time模块

    (1)时间戳(timestamp) :通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。

    (2)格式化的时间字符串(Format String):

    %y 两位数的年份表示(00-99)
    %Y 四位数的年份表示(000-9999)
    %m 月份(01-12)
    %d 月内中的一天(0-31)
    %H 24小时制小时数(0-23)
    %I 12小时制小时数(01-12)
    %M 分钟数(00=59)
    %S 秒(00-59)
    %a 本地简化星期名称
    %A 本地完整星期名称
    %b 本地简化的月份名称
    %B 本地完整的月份名称
    %c 本地相应的日期表示和时间表示
    %j 年内的一天(001-366)
    %p 本地A.M.或P.M.的等价符
    %U 一年中的星期数(00-53)星期天为星期的开始
    %w 星期(0-6),星期天为星期的开始
    %W 一年中的星期数(00-53)星期一为星期的开始
    %x 本地相应的日期表示
    %X 本地相应的时间表示
    %Z 当前时区的名称
    %% %号本身
    

    (3)元组(struct_time) :struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天等)

    索引(Index) 属性(Attribute) 值(Values)
    0 tm_year(年) 比如2011
    1 tm_mon(月) 1 - 12
    2 tm_mday(日) 1 - 31
    3 tm_hour(时) 0 - 23
    4 tm_min(分) 0 - 59
    5 tm_sec(秒) 0 - 60
    6 tm_wday(weekday) 0 - 6(0表示周一)
    7 tm_yday(一年中的第几天) 1 - 366
    8 tm_isdst(是否是夏令时) 默认为0
    #导入时间模块
    >>>import time
    
    #时间戳
    >>>time.time()
    1500875844.800804
    
    #时间字符串
    >>>time.strftime("%Y-%m-%d %X")
    '2017-07-24 13:54:37'
    >>>time.strftime("%Y-%m-%d %H-%M-%S")
    '2017-07-24 13-55-04'
    
    #时间元组:localtime将一个时间戳转换为当前时区的struct_time
    time.localtime()
    time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24,
              tm_hour=13, tm_min=59, tm_sec=37, 
                     tm_wday=0, tm_yday=205, tm_isdst=0)
    

    时间转换

    # 格式化时间 ---->  结构化时间
    ft = time.strftime('%Y/%m/%d %H:%M:%S')
    st = time.strptime(ft,'%Y/%m/%d %H:%M:%S')
    print(st)
    # 结构化时间 ---> 时间戳
    t = time.mktime(st)
    print(t)
    
    # 时间戳 ----> 结构化时间
    t = time.time()
    st = time.localtime(t)
    print(st)
    # 结构化时间 ---> 格式化时间
    ft = time.strftime('%Y/%m/%d %H:%M:%S',st)
    print(ft)
    

    6.random模块

    >>> import random
    #随机小数
    >>> random.random()      # 大于0且小于1之间的小数
    0.7664338663654585
    >>> random.uniform(1,3) #大于1小于3的小数
    1.6270147180533838
    #恒富:发红包
    
    #随机整数
    >>> random.randint(1,5)  # 大于等于1且小于等于5之间的整数
    >>> random.randrange(1,10,2) # 大于等于1且小于10之间的奇数
    
    
    #随机选择一个返回
    >>> random.choice([1,'23',[4,5]])  # #1或者23或者[4,5]
    #随机选择多个返回,返回的个数为函数的第二个参数
    >>> random.sample([1,'23',[4,5]],2) # #列表元素任意2个组合
    [[4, 5], '23']
    
    
    #打乱列表顺序
    >>> item=[1,3,5,7,9]
    >>> random.shuffle(item) # 打乱次序
    >>> item
    [5, 1, 3, 7, 9]
    >>> random.shuffle(item)
    >>> item
    [5, 9, 7, 1, 3]
    

    7.logging模块

    (旗舰版logging)

    import logging.config  # 注意不是logging,而是logging.config
    
    # 定义三种日志输出格式 开始
    
    standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d][%(levelname)s][%(message)s]'
    # 其中name为getlogger指定的名字(格式太复杂....)
    
    simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d][%(message)s]'
    
    # 定义日志输出格式 结束
    
    # 确定log文件名与log文件的路径
    logfile_name = 'login.log'
    logfile_path_staff = r'D:s23day19日志模块旗舰版日志文件夹staff.log'
    logfile_path_boss = r'D:s23day19日志模块旗舰版日志文件夹oss.log'
    # 可以使用os模块使路径动态化
    
    
    # log配置字典
    
    LOGGING_DIC = {
        'version': 1,  # 版本号(固定写法)
        'disable_existing_loggers': False,  # 固定写法(固定写法)
        # 以上两个为固定写法
    
        # 格式,每个键对应一个字典,字典中有你想要定义的格式
        'formatters': {
            'standard': {
                'format': standard_format
            },  # standard_format
            'simple': {
                'format': simple_format
            },  # simple_format
        },
        # 格式配置结束
    
        'filters': {},  # 过滤器(不用理他,默认不写就好)
    
        # 处理器开始编写
        'handlers': {
            # 打印到终端的日志
            'sh': {
                'level': 'DEBUG',  # 设置提示级别
                'class': 'logging.StreamHandler',  # 打印到屏幕
                'formatter': 'id_simple'  # 打印格式
            },
    
            # 打印到文件的日志,收集info及以上的日志
            'fh': {
                'level': 'DEBUG',  # 设置提示级别
                'class': 'logging.handlers.RotatingFileHandler',  # 保存到文件
                'formatter': 'standard',  # 日志的写入格式
                'filename': logfile_path_staff,  # 日志文件路径
                'maxBytes': 5000,  # 日志大小 5M
                'backupCount': 5,  # 轮转数量
                'encoding': 'utf-8',  # 日志文件的编码,再也不用担心中文log乱码了
            },
        },
        # 最后的收尾工作了
        'loggers': {
            # 一会通过logging.getLogger(__name__)拿到的logger配置,然后进行log的书写
            '': {   # ''这个空字符为固定写法
                # 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
                'handlers': ['sh', 'fh'],  
                'level': 'DEBUG',   # 设定log全局的最低级别
                'propagate': True,  # 向上(更高level的logger)传递
            },
        },
    }
    
    def md_logger():
        logging.config.dictConfig(LOGGING_DIC)  # 导入上面定义的logging配置
        logger = logging.getLogger()  # 生成一个log实例
        logger.debug('It works!')  # 记录该文件的运行状态
        # logger.info('It works!')  # 通过logger.(信息级别)记录
        # logger.warning('It works!')
    
  • 相关阅读:
    [LeetCode] Output Contest Matches 输出比赛匹配对
    [LeetCode] 527. Word Abbreviation 单词缩写
    [LeetCode] Permutation in String 字符串中的全排列
    [LeetCode] 560. Subarray Sum Equals K 子数组和为K
    [LeetCode] Reshape the Matrix 重塑矩阵
    [LeetCode] 536. Construct Binary Tree from String 从字符串创建二叉树
    [LeetCode] IPO 上市
    [LeetCode] Binary Tree Tilt 二叉树的坡度
    [LeetCode] Array Partition I 数组分割之一
    [LeetCode] Zuma Game 祖玛游戏
  • 原文地址:https://www.cnblogs.com/luckinlee/p/11620319.html
Copyright © 2011-2022 走看看