一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
#编写好的一个python文件可以有两种用途: 一:脚本,一个文件就是整个程序,用来被执行 二:模块,文件中存放着一堆功能,用来被导入使用 #python为我们内置了全局变量__name__, 当文件被当做脚本执行时:__name__ 等于'__main__' 当文件被当做模块导入时:__name__等于模块名 #作用:用来控制.py文件在不同的应用场景下执行不同的逻辑(或者是在模块文件中测试代码) if __name__ == '__main__':
为何要使用模块?
如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用,
导入模块import
模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,
它们只在模块名第一次遇到导入import语句时才执行, 第一次导入后就将模块内容加载到内存,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句, 可以从sys.modules中找到当前已经加载的模块,sys.modules是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入。
导入py内置模块:import 内置模块名(内置模块地址python36/lib)
安装导入第三方模块: 再cmd中输 pip.exe路径 pip install 要安装的模块名,就可以去py中导入
导入自定义模块:1.再运行py的同级目录创建py文件,文件内有执行的方法,函数程序(不可跨目录) 2.import 自定义模块py名 py名.py函数名运行
命名空间
导入一个模块的时候命名空间的变化
第一:创建了一块属于这个模块的命名空间
第二:创建了一个变量 指向这个命名空间
第三:执行这个文件
为导入的模块起别名 as
模块导入后可以用as语法把模块名定给一个变量,相当于再调用的全局空间中用变量来指向模块内存地址
当两个模块提供的功能相似,使用时要根据状态改变,可以使用as给同一个变量,加if语句判断使用情况,再使用时只需用变量名,可以按if转换模块名
作用: 1.可以将长的模块名改成段的,便于操作 2.有利于代码的拓展优化
用法:from time import datetime as read
1 mode = 'pickle' 2 if mode == 'pickle': 3 import pickle 4 else: 5 import json 6 7 def dump(): 8 if mode == 'pickle': 9 pickle.dump(obj,f) 10 elif mode == 'json': 11 json.dump(obj, f) 12 13 def load(): 14 if mode == 'pickle': 15 pickle.load(f) 16 elif mode == 'json': 17 json.load(f) 18 19 #再不同模块相似功能及使用情况下 20 21 mode = 'pickle' 22 if mode == 'pickle': 23 import pickle as mode 24 else: 25 import json as mode 26 27 def dump(): 28 mode.dump(obj,f) 29 30 def load(): 31 mode.load(f)
常用模块
1.hashlib
哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
import hashlib def md5(a,b): md5 = hashlib.md5(a.encode('utf-8')) md5.update(b.encode('utf-8')) print(md5.hexdigest()) md5('加密用盐','加密文件') # 计算结果如下: 10aa8dd7290464266ec0c08b7a5e9bce
值得注意的是,一个文件一次加密和分割后多次update加密最后的密文一致
2.random
>>> import random #随机小数
random.random() # 大于0且小于1之间的小数 random.uniform(起始int,结束int) #中间取小数 #随机整数 random.randint(1,5) # 大于等于1且小于等于5之间的整数 random.randrange(1,10,2) # 大于等于1且小于10之间的奇数(切片取值) #随机选择一个返回 random.choice([1,'23',[4,5]],x) #默认没x,从有序数列结构中随机选择一个
#选择x个返回,可重复 random.sample([1,'23',[4,5]],x) # #列表元素任意2个组合 不重复 #打乱列表顺序 item=[1,3,5,7,9] random.shuffle(item) # 打乱次序 print(item) [5, 1, 3, 7, 9]
3.sys
sys模块是与python解释器交互的一个接口
1 sys.argv[cmd窗口参数列表索引] 2 接收cmd方式调用,命令行生成参数List,空格间隔输入py执行使用参数 3 0索引元素是py文件路径,1索引传入第一个参数,2索引是传入的第二个参数 4 sys.exit(n) 退出程序,正常退出时exit(0),错误退出sys.exit(1) 5 sys.version 获取Python解释程序的版本信息 6 sys.path 返回模块的搜索路径,py查找模块的目录,初始化时使用PYTHONPATH环境变量的值
sys.path.append(path) 添加一个模块查找目录
7 sys.platform 返回操作系统平台名称
8 sys.getrecursionlimit() python默认支持的递归数量 1000
9 sys.setrecursionlimit(998) 更改递归层数
10 sys.getrefcount , 获取一个变量的被赋值引用次数
"""让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删除。 C:Python36python36.exe D:/code/s21day14/7.模块传参.py D:/test -----> 用py程序7.传参模块脚本删除指定文件 cmd 窗口命令(C:Python36)环境变量以有,不必输入:python36 D:/code/s21day14/7.模块传参.py D:/text(列表索引1,参数元素) """ import sys # 在cmd中先导入程序运行py36,再获取用户执行脚本地址加入,传入的参数(被操作文件路径)。 # C:Python36python36.exe D:/code/s21day14/7.模块传参.py D:/test print(sys.argv) #cmd导入成功后打印sys.argv = [D:/code/s21day14/7.模块传参.py, D:/test] path = sys.argv[1] print(path) # 模块删除目录(以下添加cmd传入参数的操作) # import shutil # shutil.rmtree(path)
4.os
os模块是与操作系统交互的一个接口
1 #当前执行这个python文件的工作目录相关的工作路径 2 os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 3 os.chdir("dirname") 改变当前脚本工作目录;相当于shell下cd 4 os.curdir 返回当前目录: ('.') 5 os.pardir 获取当前目录的父目录字符串名:('..') 6 7 #和文件夹相关 8 os.makedirs('dirname1/dirname2') 可生成多层递归目录 9 os.removedirs('dirname1') 若目录为空,则删除,并递归到上一级目录,如若也为空,则删除,依此类推 10 os.mkdir('dirname') 生成单级目录;相当于shell中mkdir dirname 11 os.rmdir('dirname') 删除单级空目录,若目录不为空则无法删除,报错;相当于shell中rmdir dirname 12 os.listdir('dirname') 列出指定目录下的所有文件和子目录,包括隐藏文件,并以列表方式打印 13 14 # 和文件相关 15 os.remove() 删除一个文件 16 os.rename("oldname","newname") 重命名文件/目录 17 os.stat('path/filename') 获取文件/目录信息 18 19 # 和操作系统差异相关 20 os.sep 输出操作系统特定的路径分隔符,win下为"\",Linux下为"/" 21 os.linesep 输出当前平台使用的行终止符,win下为" ",Linux下为" " 22 os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为: 23 os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix' 24 25 # 和执行系统命令相关 26 os.system("bash command") 运行shell命令,直接显示 27 os.popen("bash command).read() 运行shell命令,获取执行结果 28 os.environ 获取系统环境变量 29 30 #path系列,和路径相关 31 os.path.abspath(path) 返回path规范化的绝对路径 32 os.path.split(path) 将path分割成目录和文件名二元组返回 33 os.path.dirname(path) 返回path的目录。其实就是os.path.split(path)的第一个元素 34 os.path.basename(path) 返回path最后的文件名。如何path以/或结尾,那么就会返回空值,即os.path.split(path)的第二个元素。 35 os.path.exists(path) 如果path存在,返回True;如果path不存在,返回False 36 os.path.isabs(path) 如果path是绝对路径,返回True 37 os.path.isfile(path) 如果path是一个存在的文件,返回True。否则返回False 38 os.path.isdir(path) 如果path是一个存在的目录,则返回True。否则返回False 39 os.path.join(path1[, path2[, ...]]) 将多个路径组合后返回,第一个绝对路径之前的参数将被忽略 40 os.path.getatime(path) 返回path所指向的文件或者目录的最后访问时间 41 os.path.getmtime(path) 返回path所指向的文件或者目录的最后修改时间 42 os.path.getsize(path) 返回path的大小
os.stat('path/filename') 获取文件/目录信息 的结构说明
1 stat 结构: 2 3 st_mode: inode 保护模式 4 st_ino: inode 节点号。 5 st_dev: inode 驻留的设备。 6 st_nlink: inode 的链接数。 7 st_uid: 所有者的用户ID。 8 st_gid: 所有者的组ID。 9 st_size: 普通文件以字节为单位的大小;包含等待某些特殊文件的数据。 10 st_atime: 上次访问的时间。 11 st_mtime: 最后一次修改的时间。 12 st_ctime: 由操作系统报告的"ctime"。在某些系统上(如Unix)是最新的元数据更改的时间,在其它系统上(如Windows)是创建时间(详细信息参见平台的文档)。 13 14 stat结构 file_size = os.stat(path).st_size
1 用os复制文件 2 import os 3 import time 4 #1.读取文件的大小(字节) 5 path=r'D:PYs20选课系统.py' 6 other_path=r'D:PYs20log' 7 file_size = os.stat(path).st_size 8 read_size=0 9 if os.path.exists(path) is True: #路径存在返回True 10 with open(path,'rb') as f, 11 open(other_path,'wb')as f1: 12 chunk=f.read(1024) 13 f1.write(chunk) 14 read_size += len(chunk) 15 val = int(read_size /file_size * 100) 16 time.sleep(0.09) #暂停0.09s 17 print(f'{val}% ',end='') #设置end的换行为空,打印完毕不换行, 重写 18 # 与 类似, 的功能为波光标移动到文件开始位,前一次内容全部撤销重写新内容
查看路径下文件
1 os.path.abspath() , 获取一个文件的绝对路径 2 path = '20190409_192149.mp4' # D:codes21day1420190409_192149.mp4 3 import os 4 v1 = os.path.abspath(path) 5 print(v1) 6 7 os.path.dirname ,获取路径的上级目录 8 import os 9 v = r"D:codes21day1420190409_192149.mp4" 10 print(os.path.dirname(v)) >>>D:codes21day14 11 12 os.path.join ,路径的拼接 13 import os 14 path = "D:codes21day14" # user/index/inx/fasd/ v = 'n.txt' 15 result = os.path.join(path,v) 16 print(result) 17 result = os.path.join(path,'n1','n2','n3') 18 print(result) 19 20 os.listdir , 查看一个目录下所有的文件【第一层】 21 import os 22 result = os.listdir(r'D:codes21day14') 23 for path in result: 24 print(path) 25 26 os.walk , 查看一个目录下所有的文件【所有层】 27 28 import os 29 result = os.walk(r'D:codes21day14') 30 for a,b,c in result: # a,正在查看的目录 b,此目录下的文件夹 c,此目录下的文件 31 for item in c: 32 path = os.path.join(a,item) 33 print(path)