• 常用模块


    一、time:和时间相关

    封装了获取时间戳和字符串形式的时间的一些方法。

    获取时间戳:

    import time
    # 时间戳:从时间元年(1970-1-1 00:00:00)到现在经过的秒数
    print(time.time())
    # 输出
    1618916107.9363585

    获取格式化时间对象:就是九个字段组成的。年、月、日、时、分、秒、夏令时

    默认参数是当前系统的时间戳:

    import time
    print(time.gmtime(1))       # 时间元年过一秒后对应的时间对象
    print(time.gmtime())        # GMT:格林尼治天文台时间,在欧洲,符合欧洲的时间。
    print(time.localtime())     # 当地时间,也就是我现在的时间
    # 输出
    time.struct_time(tm_year=1970, tm_mon=1, tm_mday=1, tm_hour=0, tm_min=0, tm_sec=1, tm_wday=3, tm_yday=1, tm_isdst=0)
    ​
    time.struct_time(tm_year=2021, tm_mon=4, tm_mday=20, tm_hour=11, tm_min=12, tm_sec=24, tm_wday=1, tm_yday=110, tm_isdst=0)
    ​
    time.struct_time(tm_year=2021, tm_mon=4, tm_mday=20, tm_hour=19, tm_min=12, tm_sec=24, tm_wday=1, tm_yday=110, tm_isdst=0)

    时间对象------>时间戳

    time_obj = time.localtime()  # 时间对象
    # 把时间对象time_obj转换成时间戳
    time_stamp = time.mktime(time_obj)   
    print(time_stamp)
    # 输出
    1618991181.0

    格式化时间对象------>可读的时间字符串

    import time
    print(time.strftime('%Y %m %d %H:%M:%S'))   # 年月日 时分秒
    # 输出
    2021 04 20 19:18:11

    把时间字符串------>时间对象

    import time
    print(time.strptime('2021 4 20 19 25 2', '%Y %m %d %H %M %S'))
    # 输出
    time.struct_time(tm_year=2021, tm_mon=4, tm_mday=20, tm_hour=19, tm_min=25, tm_sec=2, tm_wday=1, tm_yday=110, tm_isdst=-1)

    暂停当前程序,睡眠xxx秒

    import time
    time.sleep(2)

    二、datetime:日期时间模块

    封装了一些和日期,时间相关的类。

    datetime主要是用于数学计算的

    data:类

    包含年、月、日

    import datetime
    d = datetime.date(2020, 5, 12)
    # 获取date对象的各个属性
    print(d.year)
    print(d.month)
    print(d.day)

    time:类

    包含时、分、秒

    import datetime
    t = datetime.time(10, 20, 55)
    print(t)
    # 获取time对象的各个属性
    print(t.hour)
    print(t.minute)
    print(t.second)

    timedelta:类---主要是用于数学计算的

    时间的变化量

    只能和date、datetime进行运算

    import datetime
    td = datetime.timedelta(days=1)
    d = datetime.date(2020, 11, 11)
    
    res = d - td  # 把2020-11-11给减去一天
    print(res)
    # 输出
    2020-11-10

    时间变化量的计算是否会产生进位?

    time类不可以和timedelta进行运算

    import datetime
    td = datetime.datetime(2020, 11, 11, 11, 11, 59)
    t = datetime.timedelta(seconds=3)
    res = t + td          # 给2020-11-11 11:11:59 加 3 秒
    print(res)
    # 输出
    2020-11-11 11:12:02   # 时间变化量的计算是会产生进位的

    练习:计算某一年的二月份有多少天。 普通算法:根据年份计算是否是闰年。是:29天,否:28天 用datetime模块 首选创建出指定年月份的3月1号,然后让它往前走一天。

    import datetime
    year = int(input('输入年份:'))
    # 创建指定年份的date对象
    d = datetime.date(year, 3, 1)
    # 创建一天的时间段
    td = datetime.timedelta(days=1)
    res = d - td
    print(res.day)

    和时间段进行运算的结果类型是和前一个操作数相关:

    import datetime
    td = datetime.timedelta(days=1)
    d1 = datetime.date(2020, 11, 11)        # 和 date 一致
    d2 = datetime.datetime(2020, 11, 11, 11, 11, 11)# 和datetime一致
    res1 = d1 - td
    res2 = d2 - td
    print(type(res1), res1)
    print(type(res2), res2)
    # 输出
    <class 'datetime.date'>      2020-11-10
    <class 'datetime.datetime'>  2020-11-10 11:11:11

    三、os模块

    和操作系统相关的操作被封装到这个模块中。

    和文件操作相关,

    删除文件: os.remove ( )

    import os
    os.remove(r'目录文件')

    删除目录:os.removedirs ( ) 必须是空目录

    import os
    os.removedirs(r'目录') # 目录下不能有文件

    使用 shutil 模块可以删除带内容的目录

    shutil.rmtree ( )

    import shutil
    shutil.rmtree(r'目录或目录路径')

    重命名: os.renames(a, b ) 把 a文件名 改成 b文件名目录名也可以修改

    import os
    os.renames('a.txt', 'b.txt')

    和路径相关的操作,被封装到另一个子模块中:os.path

    os.path.dirname():不判断路径是否存在,只拿走路径

    import os
    path = os.path.dirname(r'd:aaabbccca.txt')
    print(path)
    # 输出
    d:aaabbccc

    os.path.basename():不判断路径是否存在,只拿走文件名

    import os
    path = os.path.basename(r'd:aaabbccca.txt')
    print(path)
    # 输出
    a.txt

    os.path.split():不判断路径是否存在,把路径中的路径名和文件名切分开返回两个元素的元组

    import os
    path = os.path.split(r'd:aaabbccca.txt')
    print(path)
    # 输出
    ('d:\aaa\bbb\ccc', 'a.txt')

    os.path.join( 'd:/', 'aa', 'bb', 'cc.txt' ):拼接路径

    import os
    path = os.path.join('aaa', 'bbb', 'ccc', 'a.txt')
    print(path)
    # 输出
    aaabbccca.txt

    os.path.abspath():返回绝对路径

    import os
    path = os.path.abspath(r'a.txt')
    print(path)
    # 输出
    C:UsersAdministratorDesktoppython练习a.txt

    os.path.isabs():判断是否绝对路径,以盘符做为开头是绝对路径,

    import os
    path1 = os.path.isabs(r'a.txt')
    path2 = os.path.isabs(r'D:a.txt')
    print(path1)
    print(path2)
    # 输出
    False
    True

    os.path.isdir():判断是否是目录,目录或文件不存在是 False

    import os
    path1 = os.path.isdir(r'bb')   #目录不存在也为False
    path2 = os.path.isdir(r'a.txt')#文件不存在或不是目录都为False
    print(path1)
    print(path2)
    # 输出
    True
    False

    os.path.exists():判断文件或目录是否存在,不存在是 False

    import os
    path1 = os.path.exists(r'bb')
    path2 = os.path.exists(r'a.txt')
    print(path1)
    print(path2)
    # 输出
    True
    True

    os.path.isfile():只能判断文件是否存在,不存在False,

    import os
    path1 = os.path.isfile(r'bb')    # 目录返回False
    path2 = os.path.isfile(r'a.txt')
    print(path1)
    print(path2)
    # 输出
    False
    True

    os.path.islink():判断是否是链接

    四、sys模块

    和python解释器相关的操作

    sys.argv[ ] 获取命令行方式运行的脚步后面的参数

    就是为了让程序以脚步方式运行时在cmd命令行传入的参数

    import sys
    print('脚本名:', sys.argv[0])  # 脚本名
    a = sys.argv[1]  # 第一个参数
    b = sys.argv[2]  # 第二个参数
    c = int(a) + int(b)
    print(f'{a}+{b}=', c)
    # 在终端运行脚步时:传入参数  5  和  3
    C:UsersYSDesktopPython全栈day16>python 练习.py 5 3
    脚本名: 练习.py
    5+3= 8

    sys.path:解释器寻找模块的路径,可以增加路径让解释器去寻找我们指定路径下的模块

    import sys
    path = sys.path
    print(path)
    # 输出
    ['C:\Users\Administrator\Desktop\python\练习', 'C:\Users\Administrator\Desktop\python',........]

    sys.modules:返回系统已经加载的模块,以字典形式返回。

    import sys
    path = sys.modules
    print(path)
    # 输出
    {'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>, .......}

    五、json模块

    JavaScript object Notation:java脚本兑现标记语言。

    是一种简单的数据交换格式。不完全的序列化

    序列化:将内存中的数据,转换成字节用以保存在文件或通过网络传输,称为序列化过程。

    json:将数据转换成字符串(不能转换set数据类型),用于存储或网络传输。(不太彻底转换到字节串的前一步字符串)

    反序列化:从文件中,网络中获取的数据,转换成内存中原来的的数据类型,称为反序列化过程

    json模块使用:

    json.dumps:序列化,从内存----->内存

    import json
    obj = json.dumps([1, 2, 3, 4])
    print(type(obj), obj)
    # 输出
    <class 'str'> [1, 2, 3, 4]

    json.domp:序列化,将json结果写入文件中,内存------->文件

    json.dump([1,2,3],文件句柄)

    import json
    with open('obj.txt', encoding='utf-8', mode='wt') as f:
        json.dump([1, 2, 3, 4], f)

    json.loads:反序列化,从内存------->内存,元组会变成列表。

    import json
    # 先序列化列表 [1, 2, 3, 4]为字符串
    obj1 = json.dumps([1, 2, 3, 4])
    print(type(obj1), obj1)            # <class 'str'> [1, 2, 3, 4]
    obj2 = json.loads(obj1)            # 在反序列化为列表
    print(type(obj2), obj2)            # <class 'list'> [1, 2, 3, 4]

    json.load:反序列化,从文件----->内存反序列化

    json.load(文件句柄)

    import json
    with open('obj.txt', encoding='utf-8', mode='rt') as f:
        # 将文件中的被序列化后的字符串反序列化回原来的字典类型
        obj = json.load(f)    
        print(type(obj),obj)
    # 输出
    <class 'list'> [1, 2, 3, 4]

    json文件通常是一次性写,一次性读,

    使用另一种方式可以实现多次写,多次读。

    把需要序列化的对象,通过多次序列化的方式,用文件的write方法,把多次序列化后的json字符串写到文件中

    import json
    with open('obj.txt', encoding='utf-8', mode='w') as f:
        f.write(json.dumps([1, 2, 3, 4]) + '
    ')
        f.write(json.dumps([5, 6, 7, 8]) + '
    ')

    把分次序列化的json字符串反序列化回来

    import json
    with open('obj.txt', encoding='utf-8', mode='rt') as f1:
        obj1 = json.loads(f1.readline().strip())
      obj2 = json.loads(f1.readline().strip())
        print(type(obj1), obj1)
        print(type(obj2), obj2)
    # 输出
    <class 'list'> [1, 2, 3, 4]
    <class 'list'> [5, 6, 7, 8]

    六、pickle:

    将python中所有的数据类型,直接转换成字节,这叫序列化过程,最彻底的序列化方式

    将字节转换成python中数据类型,反序列化过程。

    pickle:的用法

    pickle.dumps:从内存-------> 内存的序列化

    import pickle
    obj = pickle.dumps([1, 2, 3, 4])
    print(obj)
    # 输出的是字节,bytes数据类型
    b'x80x04x95
    x00x00x00x00x00x00x00]x94(Kx01Kx02Kx03Kx04e.'

    pickle.dump:从内存-------->文件的序列化

    用 w 操作方式模式打开文件,用 b 为操作单位。

    import pickle
    # 二进制模式(b)不能使用编码参数 encoding 
    with open('obj.txt', mode='wb') as f: 
        pickle.dump([1, 2, 3, 4], f)

    pickle.loabs:从内存------>内存的反序列化

    import pickle
    obj1 = pickle.dumps([1, 2, 3, 4]) # 先序列化成字节
    print(type(obj1))
    print(obj1)
    
    obj2 = pickle.loads(obj1)    # 在反序列化回我原有的数据类型
    print(type(obj2))
    print(obj2)
    # 输出
    <class 'bytes'>
    b'x80x04x95
    x00x00x00x00x00x00x00]x94(Kx01Kx02Kx03Kx04e.'
    <class 'list'>
    [1, 2, 3, 4]

    pickle.load:从文件------>内存中反序列化

    with open('obj.txt', mode='rb') as f:
        obj = pickle.load(f)
        print(type(obj), obj)
    # 输出
    <class 'list'> [1, 2, 3, 4]

    pickle可以无限次数的操作同一个文件

    import pickle
    
    with open('obj.txt', mode='wb') as f1:
        pickle.dump([1, 2, 3, 4], f1)
        pickle.dump([5, 6, 7, 8], f1)
        pickle.dump([9, 10, 11, 12], f1)
        pickle.dump([13, 14, 15, 16], f1)
    
    with open('obj.txt', mode='rb') as f2:
        for i in range(4):
            obj = pickle.load(f2)
            print(type(obj), obj)
    # 输出
    <class 'list'> [1, 2, 3, 4]
    <class 'list'> [5, 6, 7, 8]
    <class 'list'> [9, 10, 11, 12]
    <class 'list'> [13, 14, 15, 16]

    pickle常用的场景,一次读入,一次写入

    七、json,pickle的比较

    json:

    1、不是所有的数据类型都可以序列化,结果是字符串。

    2、不能多次对同一个文件序列化。

    3、json数据可以跨语言

    pickle:

    1、所有的python类型都能序列化,结果是字节。

    2、可以多次对同一个文件序列化

    3、不能跨语言。

    八、hashlib

    封装一些用于加密的类

    md5()

    sha系列:随之sha系列数字越高,加密越复杂,越不容易被破解,但是耗时越长

    加密的目的:用于判断和验证,而并非解密。

    给一个数据加密,

    验证:用另一个数据加密的结果和第一次加密的结果对比。

    如果结果相同,说明原文相同,如果不相同,说明原文不同

     

    不同加密算法:实际上就是加密结果长度不同;

    s = hashlib.sha224()
    s.update('1中国'.encode('utf-8'))
    ss = s.hexdigest()
    print(ss)
    # 输出
    3e2005cdfbc101b06367b0a1d3c2a9d25fcbf391a0f67a4d0cc0dfe0

    特点:

    把一个大的数据,切分成不同的小块,分别对不同的块进行加密,在汇总的结果,和直接对数据加密的结果是一致的。

    import hashlib
    hash_obj1 = hashlib.md5()
    hash_obj1.update('123abc小杨'.encode('utf-8'))
    hash_obj1.update('opqlst'.encode('utf-8'))
    obj1 = hash_obj1.hexdigest()
    print(obj1)
    
    hash_obj2 = hashlib.md5()
    hash_obj2.update('123abc小杨opqlst'.encode('utf-8'))
    obj2 = hash_obj2.hexdigest()
    print(obj2)
    # 输出
    f6de00d04ded3774ae46e2fff7bbbd46
    f6de00d04ded3774ae46e2fff7bbbd46

    单向加密,不可逆。(山东大学,王教授,研究出了md5的破解,就是撞库)

    原始数据的一点小的变化,将导致结果的非常大的差异(雪崩效应)

    使用方式:

    1、获取一个加密对象

    2、使用加密对象的update,进行加密,可以调用多次进行累计加密

    3、通过hexdiges获取加密结果

    import hashlib
    # 1、获取一个加密对象
    hash_obj = hashlib.md5()
    # 2、使用加密对象的update,进行加密,可以调用多次进行累计加密
    hash_obj.update('123abc小杨'.encode('utf-8'))
    # 第二次累积加密相当于对>>‘123abc小杨opqlst’进行加密
    hash_obj.update('opqlst'.encode('utf-8'))
    # 3、通过hexdiges获取加密结果
    obj = hash_obj.hexdigest()
    print(obj)
    # 输出
    f6de00d04ded3774ae46e2fff7bbbd46

    在创建加密对象时,可以指定参数,称为加盐:

    import hashlib
    hash_obj = hashlib.md5('加的盐'.encode('utf-8'))
    hash_obj.update('123abc小杨opqlst'.encode('utf-8'))
    obj = hash_obj.hexdigest()
    print(obj)        
    # 输出
    5d81bdb5422fc66644f321ed6d254521

    动态的盐

    import hashlib
    username = 'xiaoyang'
    password = 'abcd123'
    hash_obj = hashlib.md5(username[::2].encode('utf-8'))  # 每个用户不一样动态的加盐
    hash_obj.update(password.encode('utf-8'))
    obj = hash_obj.hexdigest()
    print(obj)   # 7adce56715fda64e0e0c425d9b6dc0c7

    md5文件的校验

    linux中一切皆文件: 文本文件,非文本文件,音频,视频,图片....

    无论你下载的视频,还是软件(国外的软件),往往都会有一个md5值

    def file_md5(path):
        ret = hashlib.sha256()
        with open(path,mode='rb') as f1:
            b1 = f1.read()
            ret.update(b1)
        return ret.hexdigest()
    result = file_md5('校验的文件名')
    print(result) 

    九、collections模块

    namedtuple():命名元组

    from collections import namedtuple
    rectangle = namedtuple('字符串用于描述rectangle类的类名', ['length', 'width'])
    r = rectangle(10, 5)
    # 通过属性访问元组的元素
    print(r.length)
    print(r.width)
    # 输出
    10
    5

    defaultdict():默认值字典,在取到没有的键时,会返回你定义的函数值,并添加进去

    defaultdict 是内置的 dict 的子类

    和 dict 的构造函数相比,只是在前面添加了一个参数: default_factory ,其余的参数和 dict 一样. 第一个参数指定的是一个函数名,用来表示当字典对象中出现了不存在的键时,对应的值初始值是如何计算.

    正因为这个函数是获取值的,所以,对这个函数规定:不能有参数.默认情况下,第一个参数是None,意味着不存在的键对应的值为None.

    注意:一旦使用 defaultdict 时,指定了不存在的键,则会引发两件事情:

    1、调用第一个参数指定的函数得到默认值.

    2、把返回值赋值给这个新键.

    from collections import defaultdict
    def func():
        return 'hello world'
    d = defaultdict(func,name='Andy',age=10)
    print(d['name'])             # Andy
    print(d['haha'])             # hello world
    print(d)                    
    # defaultdict(<function func at 0x000002C9A0D71E18>, {'name': 'Andy', 'age': 10,'haha': 'hello world'})

    counter():计数器

    用于统计可哈希对象的数量.

    是dict的子类.一种特殊的字典.

    它的键是可哈希对象,值是这个对象的个数统计信息.个数可以是手动指定的,也可以是自动计算出来的,并且可以是负数和0.

    创建Counter对象.

    c = Counter()                 # 创建空的计数器
    c = Counter('abcdefabc')     # 使用可迭代对象创建计数器
    c = Counter({'A':1,'B':3})     # 使用字典创建计数器
    c = Counter(A=1,B=3,C=0)     # 手动初始化计数器

    查看计数器的统计结果,和使用字典的方式相同:

    from collections import Counter
    c = Counter('abcab')
    print(c)                 # Counter({'a': 2, 'b': 2, 'c': 1})
    print(c['a'])             # 2
    print(c['b'])             # 2
    print(c['name'])         # 0

    Counter常用方法:

    most_common[n]:显示数量最多的前几名。

    from collections import Counter
    c = Counter('abcab')
    print(c.most_common(2)) # [('a', 2), ('b', 2)]

    十、random模块

    此模块提供了随机数获取方法

    random.random( ):获取 [ 0.0, 1.0) 范围内的浮点数(伪随机数,有规律的)

    import random
    print(random.random())    # 0.6291924643028873

    random.randint(a, b):获取 [a, b] 范围内的一个整数

    import random
    print(random.randint(3, 10))    # 5

    random.uniform(a,b):获取 [a, b ) 范围内的浮点数

    import random
    print(random.uniform(3, 10))    # 6.327077680813884

    random.shuffle( x ):把参数指定的数据中的元素打乱洗。参数必须是可变的数据类型

    import random
    ll = list(range(10))
    random.shuffle(ll)
    print(ll)    # [4, 8, 1, 6, 7, 9, 0, 3, 2, 5]

    random.sample( x , k ):从 x 中随机抽取 k 个数据,组成一个列表返回

    import random
    t = (1, 2, 3, 4, 5, 6, 7, 8, 9)
    ls = random.sample(t, len(t))    # 因为元组不可修改
    print(ls)    # [6, 4, 8, 1, 2, 7, 3, 9, 5]
    学习之旅
  • 相关阅读:
    asp.net 中的viewstate用法?
    .net中 过滤 指定 字符串
    js中replace的用法
    restart
    外部函数
    JQuery实现Ajax 根据商品名称自动显示价格
    ListView中命令行按钮应用;
    GridView中获取行数和列数
    全局应用程序类Global
    如何获取gridview中模板列中控件的值?
  • 原文地址:https://www.cnblogs.com/XiaoYang-sir/p/14688382.html
Copyright © 2020-2023  润新知