• Python常用的模块和包


    1. 导入包和模块

    1.1 import导入模块

    1)导入模块

    模块可以包含可执行的语句和函数的定义,这些语句的作用是初始化模块,它们只在模块第一次遇到导入语句import时才执行。

    import语句可以在程序中的任意位置使用,且在第一次导入之后就将模块名加载到内存中了,后续对于同样模块的import仅仅是对已经加载到内存中的模块对象增加了一次引用,不会重新执行模块内的语句。

    # 只在第一次导入时才执行xxoo.py内的代码,
    import xxoo 

    2)定义模块别名

    可以在导入模块后使用as关键字定义模块别名,定义别名的目的是为了方便使用。

    import xxoo.py as fuck
    fuck.read1()

    3)第一次导入模块执行的事件

    为源文件(xxoo.py)创建新的名称空间,在xxoo.py中定义的函数和方法若是使用到了global时访问的就是这个名称空间。

    创建名字xxoo来引用该命名空间,这个名字和变量名没有什么区别。

    重复导入会直接引用内存中已经加载好的结果。

    4)被导入的模块具有独立的名称空间

    每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做是全局名称空间。

    这样在编写自己的模块时,就不用担心定义在自己模块中的全局变量会在被导入时,与使用者的全局变量冲突。

    1.2 from ... import ...

    from ... import .. 是将模块中的名字直接导入到当前的名称空间中,所以在当前名称空间中,直接使用名字就可以,无需加前缀 . 的形式。

    但是这样容易与当前执行文件中的名称冲突。执行文件若有与模块同名的变量或者函数名,会有覆盖效果。

    1)使用as别名的形式

    from xxoo import fuck as read
    read()

    2)一行导入多个

    from xxoo import fuck,read2,name

    3)from ... import *

    把模块中所有的不是以下划线(_)开头的名称都导入到当前位置。

    大部分情况下不应该使用这种导入方式,因为 * 不知道导入什么名字,可能会覆盖掉之前已经定义的名字。

    可以使用__all__来控制 * (用来发布新版本),在模块文件中新增一行:

    __all__=['money','read1'] # 这样在另外一个文件中用from spam import * 就这能导入列表中规定的两个名字

    1.3 模块搜索路径

    1)模块的查找顺序

    模块查找的顺序是:内存中已经加载的模块 ——> 内置模块 ——> sys.path路径中包含的模块

    1. 在第一次导入某个模块时,会先检查该模块是否已经被加载到内存中(当前执行文件的名称空间对应的内存),如果有则直接引用
      • python解释器在启动时会自动加载一些模块到内存中,可以使用sys.models来查看
    2. 如果没有,解释器则会查找同名的内置模块
    3. 如果还没有,就从sys.path给出的目录列表中依次寻找模块文件

    2)sys.path

    • 自定义的模块不应该与系统内置模块重名。
    • 在初始化之后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载。
    • 搜索时按照sys.path中从左到右的顺序查找,sys.path中可能会包含 .zip 归档文件,python会把 .zip 归档文件当成一个目录去处理。

    3)windows下的路径

    • windows下的路径开头要加 r,否则会出现语法错误。
    sys.path.insert(0,r'C:UsersAdministratorPycharmProjectsa')

    2. time模块

    2.1 time表示时间的几种格式

    时间戳是机器能够识别的时间,字符串是人能看懂的时间,元组则是用来操作时间的。

    #导入时间模块
    >>>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)

    2.2 时间格式的转换

    1)时间戳  ——> 结构化时间

    • UTC时间:英国伦敦当地时间
    • 北京时间:与UTC时间相差8小时,北京时间=UTC时间+8小时
    # 时间戳 --> 结构化时间
    # time.gmtime(时间戳)    # UTC时间
    # time.localtime(时间戳) # 当地时间
    
    >>>time.gmtime(1500000000)
    time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=2, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)
    
    >>>time.localtime(1500000000)
    time.struct_time(tm_year=2017, tm_mon=7, tm_mday=14, tm_hour=10, tm_min=40, tm_sec=0, tm_wday=4, tm_yday=195, tm_isdst=0)

    2)结构化时间 ——> 时间戳

    #结构化时间-->时间戳 
    #time.mktime(结构化时间)
    >>>time_tuple = time.localtime(1500000000) # 将时间戳转换成结构化时间
    >>>time.mktime(time_tuple)  # 将结构化时间转换成时间戳
    1500000000.0

    3)结构化时间 ——> 字符串时间

    #结构化时间-->字符串时间
    # time.strftime("格式定义","结构化时间")  结构化时间参数若不传,则显示当前时间
    >>>time.strftime("%Y-%m-%d %X") '2017-07-24 14:55:36' >>>time.strftime("%Y-%m-%d",time.localtime(1500000000)) '2017-07-14'

    4)字符串时间 ——> 结构化时间

    # 字符串时间-->结构化时间
    # time.strptime(时间字符串,字符串对应格式)
    >>>time.strptime("2017-03-16","%Y-%m-%d")
    time.struct_time(tm_year=2017, tm_mon=3, tm_mday=16, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=3, tm_yday=75, tm_isdst=-1)
    >>>time.strptime("07/24/2017","%m/%d/%Y") time.struct_time(tm_year=2017, tm_mon=7, tm_mday=24, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=205, tm_isdst=-1)

    5)其他相关

    #结构化时间 --> %a %b %d %H:%M:%S %Y串
    #time.asctime(结构化时间) 如果不传参数,直接返回当前时间的格式化串
    >>>time.asctime(time.localtime(1500000000))
    'Fri Jul 14 10:40:00 2017'
    >>>time.asctime()
    'Mon Jul 24 15:18:33 2017'
    #时间戳 --> %a %b %d %H:%M:%S %Y串 #time.ctime(时间戳) 如果不传参数,直接返回当前时间的格式化串 >>>time.ctime() 'Mon Jul 24 15:19:07 2017' >>>time.ctime(1500000000) 'Fri Jul 14 10:40:00 2017'

    2.3 计算时间差

    import time
    true_time=time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S'))
    time_now=time.mktime(time.strptime('2017-09-12 11:00:00','%Y-%m-%d %H:%M:%S'))
    dif_time=time_now-true_time
    struct_time=time.gmtime(dif_time)
    print('过去了%d年%d月%d天%d小时%d分钟%d秒'%(struct_time.tm_year-1970,struct_time.tm_mon-1,
                                           struct_time.tm_mday-1,struct_time.tm_hour,
                                           struct_time.tm_min,struct_time.tm_sec))

    2.4 datetime

    1)获取当前日期和时间

    from datetime import datetime
    print(datetime.now())
    # datetime.now()返回当前日期和时间,其类型是datetime
    '''
    结果:2018-12-04 21:07:48.734886
    '''

    2)获取指定日期和时间

    from datetime import datetime
    dt = datetime(2018,5,20,13,14)
    print(dt)
    '''
    结果:2018-05-20 13:14:00
    '''

    3)datetime转换为timestamp

    from datetime import datetime
    dt = datetime.now()
    new_timestamp = dt.timestamp()
    print(new_timestamp)
    '''
    结果:1543931750.415896
    '''

    4)timestamp转换为datetime

    import time
    from datetime import datetime
    new_timestamp = time.time()
    print(datetime.fromtimestamp(new_timestamp))

    5)str转换为datetime

    from datetime import datetime
    t = datetime.strptime('2018-4-1 00:00','%Y-%m-%d %H:%M')
    print(t)
    '''
    结果: 2018-04-01 00:00:00
    '''

    6)datetime转换为str

    from datetime import datetime
    now = datetime.now()
    print(now.strftime('%a, %b %d %H:%M'))
    Mon, May 05 16:28

    7)datetime加减

    from datetime import datetime, timedelta
    # 主要要导入timedelta这个类
    now = datetime.now()
    now
    datetime.datetime(2015, 5, 18, 16, 57, 3, 540997)
    now + timedelta(hours=10)
    datetime.datetime(2015, 5, 19, 2, 57, 3, 540997)
    now - timedelta(days=1)
    datetime.datetime(2015, 5, 17, 16, 57, 3, 540997)
    now + timedelta(days=2, hours=12)
    datetime.datetime(2015, 5, 21, 4, 57, 3, 540997)

    8)注意

    • datetime表示的时间需要时区信息才能确定一个特定的信息,否则只能视为本地时间
    • 如果要存储datetime,最佳方法是将其转换为timestamp再存储,因为timestamp的值与时区完全无关

    3. random模块

    import random
    
    # 随机小数
    random.random()                 # 大于0且小于1之间的小数 (0, 1)
    random.uniform(1,3)             # 大于1小于3的小数 (1, 3)
    
    # 随机整数
    random.randint(1,5)             # 大于等于1且小于等于5之间的整数 [1, 5]
    random.randrange(1,3)           # 大于等于1且小于3之间的整数  [1, 3)
    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个组合
    
    # 打乱列表的顺序
    item = [1, 3, 5, 7, 9]
    random.shuffle(item)            # 将传入的对象内容顺序打乱
    print(item)
    • 实现5位随机验证码功能
    # 实现5位随机验证码功能:
    def v_code():
        ret = ""
        for i in range(5):
            num = random.randint(0,9)
            alp = chr(random.randint(65, 90))      # ASCII码表的A到Z依次对应于65到90
            res = str(random.choice([num, alp]))   # 这里用了str将可能出现的数字转换为str类型
            ret += res
        return ret
    print(v_code())

    4. os模块

    • os模块是与操作系统交互的一个接口

    4.1 文件夹相关

    import os
    os.makedirs('dirname1/dirname2')  # 可生成多层递归目录
    os.removedirs('dirname1')         # 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推
    os.mkdir('dirname')               # 生成单级目录;相当于shell中mkdir dirname
    os.rmdir('dirname')               # 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname
    os.listdir('dirname')             # 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印

    4.2 文件相关

    import os
    os.remove()                      # 删除一个文件
    os.rename("oldname", "newname")  # 重命名文件/目录
    os.stat("path/filename")         # 获取文件/目录信息

    4.3 操作系统差异相关

    import os
    os.sep # 输出操作系统特定的路径分隔符,win下为\ , linux下为/ os.linesep # 输出当前平台使用的行终止符,win下为 , Linux下为 os.pathsep # 输出用于分割文件路径的字符串 ,win下为; Linux下为: os.name # 输出字符串指示当前使用平台,win下为"nt" , Linux下为"posix"

    4.4 执行系统命令相关

    import os
    os.system("bash command")        # 运行shell命令,直接显示
    os.popen("bash command").read()  # 运行shell命令,获取执行结果
    os.environ                       # 获取系统环境变量

    4.5 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.exists(path)   # 如果path存在,返回True,如果path不存在,返回False
    
    os.path.isabs(path)    # 如果path是绝对路径,返回True
    os.path.isfile(path)   # 如果path是一个存在的文件,返回Ture,否则返回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)  # 返回文件的大小

    4.6 工作路径

    import os
    os.getcwd() # 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") # 改变当前脚本工作目录;相当于shell下cd os.curdir # 返回当前目录: ('.') os.pardir # 获取当前目录的父目录字符串名:('..')

    4.7 start

    • os.stat('path/filename') 获取 文件/目录信息 的结构说明
    stat 结构:
    st_mode: inode 保护模式
    st_ino: inode 节点号。
    st_dev: inode 驻留的设备。
    st_nlink: inode 的链接数。
    st_uid: 所有者的用户ID。
    st_gid: 所有者的组ID。
    st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。
    st_atime: 上次访问的时间。
    st_mtime: 最后一次修改的时间。
    st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)

    5. sys模块

    • sys模块是python解释器交互的一个接口
    sys.argv           # 命令行参数List,第一个元素是程序本身路径
    sys.exit(n)        # 退出程序,正常退出时exit(0),错误退出sys.exit(1)
    sys.version        # 获取Python解释程序的版本信息
    sys.path           # 返回模块的搜索路径,初始化时使用PYTHONPATH环境变量的值
    sys.platform       # 返回操作系统平台名称
    • 进度条
    # 进度条
    import time
    for i in range(30):
        sys.stdout.write("#") # 其实print函数在内部调用的就是这种形式
        time.sleep(0.2)
        sys.stdout.flush()    # 这里的刷新是将缓冲区的文本信息打印到屏幕上

    6. json&pickle模块

    6.1 序列化&反序列化

    • 序列化简单来说就是将python的数据结构存储到文件中
    • 反序列化就是把存储到文件中的数据结构重新加载恢复出来

    6.2 json的dump&load

    import json
    dic = {"name": "hgzero"}
    
    # dump
    f = open("new_welcome", "w", encoding='utf-8')
    json.dump(dic, f)
    # 第一个参数是要转换的数据类型,第二个参数是一个文件句柄,也就是要存到那个文件中
    
    # load
    f_read = open("new_welcome", "r", encoding='utf-8')
    data = json.load(f)
    # load可以从一个文件中读取内容

    6.3 json的dumps&loads

    import json
    dic = {"name": "hgzero"}
    
    # json的序列化和反序列化:(json可以在任何支持json的编程语言间传输)
    dic_str = json.dumps(dic)  # json的dumps方法可以将传入的数据转换成字符串
    f = open("new_welcome", "w")
    f.write(dic_str)
    
    
    f_read = open("new_welcome", "r") 
    data = json.loads(f_read.read())  # json的loads方法可以将json格式的字符串还原成原来的格式
    print(data)
    
    # json字符串的规范:
    # 数据类型中全部使用双引号 ""
    
    # 注意:只要符合json规范,就能loads,而不需要先dumps后loads

    6.4 pickle

    # pickle的序列化和反序列化:(pickle中是以字节形式保存,且只能在python中使用)
    # pickle可以支持python中的全部数据类型(包括函数、类)
    # pickle的用法和使用json完全一样

    7. hashlib模块

  • 相关阅读:
    CF1093F Vasya and Array
    CF1093D Beautiful Graph
    mysql主主同步
    mysql主从机制的部署与应用
    什么是多项式?
    从线性逼近到多项式逼近:泰勒级数
    机器学习--boosting家族之XGBoost算法
    倾情大奉送--Spark入门实战系列
    [机器学习笔记] 什么是分类,什么是回归?
    kafka中处理超大消息的一些考虑
  • 原文地址:https://www.cnblogs.com/hgzero/p/13110840.html
Copyright © 2020-2023  润新知