python模块module package
module
package
常用模块
模块与包的区别
模块分为内置模块。第三方模块,自定义模块
程序会先从内置到第三方再到当前工作目录下去找你导入的模块,如果你自定义的模块不在当前工作目录下就会报错。
模块
一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。
随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。
这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用,
导入模块
import module名
导入模块时python会做三件事
1.为源文件(spam模块)创建新的名称空间,在spam中定义的函数和方法若是使用到了global时访问的就是这个名称空间。
2.在新创建的命名空间中执行模块中包含的代码,见初始导入import spam
3.创建名字spam来引用该命名空间
为模块起别名
import pandas as pd
在一行导入多个模块,不推荐(可读性不强)
import pandas ,os ,time
from module import 变量名
将模块当脚本执行
if __name__ == '__main__':
main()
每一个py文件都有自己的__name__ 这条语句的作用:用来控制.py文件在不同的应用场景下执行不同的逻辑。
当该py文件被直接运行时,__nam__这条属性就是__mian__ ,条件成立,被执行。而当这个py文件被当模块导入时,这个__name__就等于该py文件的名字,条件不成立。可以用来测试。
模块搜索路径
python解释器在启动时会自动加载一些模块,可以使用sys.modules查看
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。虽然每次都说,但是仍然会有人不停的犯错。
初始化后,python程序可以修改sys.path,路径放到前面的优先于标准库被加载。
dir函数
The built-in function dir()
is used to find out which names a module defines. It returns a sorted list of strings:
内建函数dir是用来查找模块中定义的名字,返回一个有序字符串列表
包(package)
1. 无论是import形式还是from...import形式,凡是在导入语句中(而不是在使用时)遇到带点的,都要第一时间提高警觉:这是关于包才有的导入语法
2. 包是目录级的(文件夹级),文件夹是用来组成py文件(包的本质就是一个包含__init__.py文件的目录)
3. import导入文件时,产生名称空间中的名字来源于文件,import 包,产生的名称空间的名字同样来源于文件,即包下的__init__.py,导入包本质就是在导入该文件
__init__.py文件
不管是哪种方式,只要是第一次导入包或者是包的任何其他部分,都会依次执行包下的__init__.py文件(我们可以在每个包的文件内都打印一行内容来验证一下),这个文件可以为空,但是也可以存放一些初始化包的代码。
关于__pycache__
当第一次运行 python 脚本时,解释器会将 *.py
脚本进行编译并保存到 __pycache__
目录
下次执行脚本时,若解释器发现你的 *.py
脚本没有变更,便会跳过编译一步,直接运行保存在 __pycache__
目录下的 *.pyc
文件
三、常用模块
1.time模块
时间日期也是一种数据类型
python 中三种表示时间的方式:时间戳,结构化时间(元组),格式化时间
通常来说,时间戳表示的是从1970年1月1日00:00:00开始按秒计算的偏移量。我们运行“type(time.time())”,返回的是float类型。
格式化的时间字符串(Format String)
结构化的时间(struct_time):struct_time元组共有9个元素共九个元素:(年,月,日,时,分,秒,一年中第几周,一年中第几天,夏令时)
time.time()获取当前时间的时间戳
time.localtime()获取当前时间的结构化时间
time.mktime() 可以吧结构化时间转化为时间戳
2.random 模块
常用于产生随机数
import random
>>> random.random()
0.0044131264670687065
>>> random.randint(1,10)
5
>>> random.randrange(1,10)
9
>>> random.uniform(1,10)
3.402412139023039
import random print(random.random())#(0,1)----float 大于0且小于1之间的小数 print(random.randint(1,3)) #[1,3] 大于等于1且小于等于3之间的整数 print(random.randrange(1,3)) #[1,3) 大于等于1且小于3之间的整数 print(random.choice([1,'',[4,5]]))#1或者23或者[4,5] print(random.sample([1,'',[4,5]],2))#列表元素任意2个组合 print(random.uniform(1,3))#大于1小于3的小数,如1.927109612082716 item=[1,3,5,7,9]
random.shuffle(item) #打乱item的顺序,相当于"洗牌"
print(item)
3.os模块
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.sep 输出操作系统特定的路径分隔符,win下为"\\",Linux下为"/"
os.linesep 输出当前平台使用的行终止符,win下为"\t\n",Linux下为"\n"
os.pathsep 输出用于分割文件路径的字符串 win下为;,Linux下为:
os.name 输出字符串指示当前使用平台。win->'nt'; Linux->'posix'
os.system("bash command") 运行shell命令,直接显示
os.environ 获取系统环境变量
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的大小
4.hashlib模块
hashlib模块提供很多摘要算法,比如MD5,SHA1,摘要算法又叫哈希算法、散列算法。它通过一个函数,把任意长度的数据转换为一个长度固定的数据串(通常用16进制的字符串表示)。
应用于
文件一致性校验
登录,将用户名的密码存为哈西后的数值,放置密码被泄露。
import hashlib
md5=hashlib.md5()
# md5.update(b'hello') #5d41402abc4b2a76b9719d911017c592
md5.update(b'world') #fc5e038d38a57032085441e7fe7010b0
print(md5.hexdigest())
摘要算法在很多地方都有广泛的应用。要注意摘要算法不是加密算法,不能用于加密(因为无法通过摘要反推明文),只能用于防篡改,但是它的单向计算特性决定了可以在不存储明文口令的情况下验证用户口令。
json模块
什么是序列化?
我们把对象(变量)从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling,在其他语言中也被称之为serialization,marshalling,flattening等等,都是一个意思。
json格式 | Python格式 |
{} | dict |
[] | list |
"string" | str |
123.45 | int or float |
true /false | True/Float |
null | None |
configparser模块
该模块适用于配置文件,配置文件类似于windows的ini文件相似。可以包含一个或多个节(section)。
导入该模块
import configparser
创建对象实例
cfg=configparser.ConfigParser()
cfg['DEFAULT']={'backgroud':'green','font':'20','color':'red','width':'30','height':'50'}
cfg['charactor']={'actor':'yuang','actress':'mengmeng','editor':'zhangjiao'}
cfg['price']={'phone':'100','computer':'3000','cup':10} #写入文件
with open('base.ini','w') as f: #保存为文件
cfg.write(f)
cfg=configparser.ConfigParser()
cfg.read('base.ini') #读取ini文件
print(cfg.sections()) #['charactor', 'price']
print(cfg.options(section='charactor'))#取出['actor', 'actress', 'editor', 'backgroud', 'font', 'color', 'width', 'height']
for i in cfg.values():
print(i) #<Section: DEFAULT> <Section: charactor> <Section: price>
print(cfg['price']['phone']) #100
subprocess模块
当我们需要调用系统的命令的时候,最先考虑的os模块。用os.system()和os.popen()来进行操作。但是这两个命令过于简单,不能完成一些复杂的操作,如给运行的命令提供输入或者读取命令的输出,判断该命令的运行状态,管理多个命令的并行等等。这时subprocess中的Popen命令就能有效的完成我们需要的操作。
导入该模块
在linux系统下可以不用加shell=True
使用ls -l 的命令时要加shell=True
也可以使用subprocess.Popen(['ls','-l'])
subprocess.Popen('ls -l',shell=True)
四、模块与包的区别
通常我们将包看做是文件系统的目录,模块是文件。但这是不严谨的。
It’s important to keep in mind that all packages are modules, but not all modules are packages. Or put
another way, packages are just a special kind of module. Specifically, any module that contains a __path__
attribute is considered a package.
所有的包都是模块,但不是所有的模块都是包,换句话说包是模块的一种特例。任何模块,含有__path__属性的都可以被认为是包