系统内置模块
系统内置模块就是安装python解释器后,系统给提供的模块
在需要时可以导入后使用,例如:json,re,os等等
1.序列化模块:方便数据存储和传输
序列化是指可以把python中的数据,以文本或二进制的方式进行转换,并且还能反序列化为原来的数据;
数据在程序与网络中进行传输和存储时,需要以更加方便的形式进行操作,因此需要对数据进行序列化;
对数据进行序列化的主要方法有以下两种
- 二进制序列化模块 pickle (python专用)
- 文本序列化模块 json (通用)
1.1 pickle 序列化 :import pickle
使用时注意先导入模块 import pickle
- dumps() 序列化,可以把一个python的任意对象序列化成为一个二进制
- 返回一个序列化后的二进制数据
- pickle.dumps(var)
- loads() 反序列化,可以把一个序列化后的二进制数据反序列化为python的对象
- 返回一个反序列化后的python对象
- pickle.loads(var)
import pickle
a = 'cxy ha!'
b = pickle.dumps(a)
c = pickle.loads(b)
print(b)
print(c)
>>> b'\x80\x03X\x07\x00\x00\x00cxy ha!q\x00.'
cxy ha!
-
dump(参数1,参数2) 序列化,把一个数据对象进行序列化并写入到已经打开的文件中
- 参数1,需要序列化的数据对象
- 参数2,写入的文件对象
- pickle.dump(var,fp)
#设定数据var #打开文件进行写入 import pickle a = 'qwq' with open('test.txt','wb') as fp: pickle.dump(a,fp)
-
load(参数1) 反序列化,在一个已经打开的文件中读取序列化的数据,并且完成一个反序列化
- 参数1,读取的文件对象
- pickle.load(fp)
import pickle with open('test.txt','rb') as fp: a = pickle.load(fp) print(a)
###1.2 json序列化:import json
JSON:JavaScript Object Notation
JSON 是一个受 JavaScript 的对象字面量语法启发的轻量级数据交换格式。JSON 在js语言中是一个对象的表示方法,和Python中的字典的定义规则和语法都很像
JSON 在互联网中又是一种通用的数据交换,数据传输,数据定义的一种数据格式
- json.dumps() 完成json格式数据的序列化
- json.loads() 完成json格式数据的反序列化
import json
a = ['你好哇!']
b = json.dumps(a)
c = json.loads(b)
print(b,type(b))
print(c,type(c))
>>>["\u4f60\u597d\u54c7!"]<class 'str'>
['你好哇!']<class 'list'>
- json.dump() 和pickle模块的dump方法一样
- json.load() 和pickle模块的load方法一样
import json
a = {1:'a',2:'b'}
with open('test.txt','w+',encoding='utf-8') as fp:
json.dump(a,fp)
print(type(a))
fp.seek(0)
b = json.load(fp)
print(b,type(b))
>>><class 'dict'>
{'1': 'a', '2': 'b'}<class 'dict'>
#注意!此时文件里的内容为:
{"1": "a", "2": "b"}
#json的是双引号
#如果a是元组,会被转为列表
#如果a是列表、字典、整型、字符串等类型,通过dump()和load()后还是原来的类型
#但是只有列表和字典转化的是json格式数据
{'name':'admin','age':20,'sex':'男'}
[1,2,3]
[
{'name':'admin','age':20,'sex':'男'},
{'name':'aa','age':21,'sex':'m'}
]
#其他的都只是转为字符串了而已
#js对象定义:
// demo.js
// javascript 中的对象定义方法
var obj = {'name':'admin','age':20,'sex':'男'}
// javascript 中的数组定义方法
var arr = [1,2,3]
2.数学与数值相关模块:math,random
###2.1 math:import math
python中的内置数学模块Math,提供了很多的数学相关运算
文档地址: https://docs.python.org/zh-cn/3.7/library/math.html#module-math
数论与表示函数
幂函数与对数函数
三角函数
角度转换
双曲函数
特殊函数
常量
import math
-
math.ceil() 向上取整
-
math.floor() 向下取整
#注意和内置函数round()的区别 import math a = round(2.5) b = round(3.5) c = math.ceil(2.5) d = math.floor(3.5) print(a,b,c,d) >>>2 4 3 3
-
math.pow() 计算数值的n次方,结果是浮点
#注意和内置函数pow()的区别 import math a = pow(2,5) b = math.pow(2,5) print(a,b) >>>32 32.0
-
math.sqrt() 开平方运算,结果是浮点
import math a = math.sqrt(3.1) b = math.modf(-3.1) print(a) >>>1.760681686165901
-
math.fabs() 计算绝对值,结果是浮点
import math a = abs(-3) b = math.fabs(-3) print(a,b) >>>3 3.0
-
math.modf() 把一个数值拆分成小数和整数组成的元组
import math a = math.modf(3) b = math.modf(-3.1) print(a,b) >>>(0.0, 3.0) (-0.10000000000000009, -3.0)
-
math.copysign(x,y) 把第二个参数的正负符合拷贝给第一个参数,结果为浮点数
import math a = math.copysign(3.1,-20) print(a) >>>-3.1
-
math.fsum() 将一个容器类型数据中的元素进行一个求和运算,结果为浮点数
import math #a = math.fsum('123') #注意这里会报错!容器中的元素必须是可以运算的number类型 b = math.fsum([1,2,3]) #列表可 c = math.fsum({1,2,3}) #集合可 d = math.fsum({1:'a',2:'b',3:'c'}) #字典可 e = math.fsum((1,2,3)) #元组也可 print(b,c,d,e) >>> 6.0 6.0 6.0 6.0 #就字符串不可
-
math.factorial(x) 以一个整数返回 x 的阶乘,x必须为整数
import math b = math.factorial(0) c = math.factorial(3) print(b,c) >>>1 6
-
math.pi 数学常数π = 3.141592…,精确到可用精度
math.e 数学常数e = 2.718281…,精确到可用精度
a = math.pi b = math.e print(a,b) >>>3.141592653589793 2.718281828459045
###2.2 random:import random
该模块实现了各种分布的伪随机数生成器
import random
-
random.random() 返回 0 - 1 之间的随机小数 (左闭右开)
import random a = random.random() print(a) >>>0.8966501036074478 print(a) >>>0.7141464273728062
-
random.randrange([开始值],结束值,[步进值]) 随机获取指定范围内的整数。【注意是左闭右开】
【验证码就是通过random.randrange()产生的,还有高并发下的订单号】
import random a = random.randrange(4) b = random.randrange(4,10) c = random.randrange(4,10,5) #步进值为5,所以只能从4和9中随机选一个 print(a,b,c) >>>1 8 4 print(a,b,c) >>>0 6 9
-
random.randint() 随机产生指定范围内的随机整数,
【注意和random.randrange()的区别!random.randint(),没有步进值,且范围是左闭右闭】
import random b = random.randint(9,10) print(b) >>>10
-
random.uniform() 获取指定范围内的随机小数
【和random.random()相比,它可以指定范围,而random.random() 只能产生0到1之间的随机小数 】
import random b = random.uniform(8,10) print(b) >>>9.08455783944536
-
random.choice() 随机获取容器类型中的值
【这里的容器类型不包括集合】
#random.choice(容器) 随机获取容器里的值,返回值的类型与容器类型无关,只与值的类型有关 import random b = random.choice([1,'c']) print(b,type(b)) >>>c <class 'str'> b = random.choice([{1:'c'},{2,3}]) print(b,type(b)) >>>{1: 'c'} <class 'dict'> print(b,type(b)) >>>{1: 'c'} <class 'dict'> {2, 3} <class 'set'> #如果容器类型是字典,返回的值是字典里的value,不是key import random a = {1:'b',2:'a','c':2} b = random.choice(a) print(b,type(b)) >>>a <class 'str'> #注意!容器类型不能是set,会报错说set对象不是可下标的 #所以random.choice()是通过随机下标来获取随机值
-
random.shuffle() 随机打乱当前列表中的值,返回值为None,直接打乱原数据。
【注意只能打乱列表!】
import random a = [1,2,3] random.shuffle(a) print(a,type(a)) >>>[3, 2, 1] <class 'list'>
3.os模块:系统操作相关模块
对接当前所使用的系统
【在python里使用os函数 == 直接在cmd输入命令】
【就跟用linux指令使用linux系统一样,也可以用os模块里的函数使用windows系统】
import os
3.1 os操作系统接口模块:提供一些方便使用操作系统相关功能的函数
-
os.getcwd() 获取当前的**工作目录,**注意获取的不是当前脚本的目录
【工作目录就是运行python编译器的目录】
【这个主要是用于cmd之类的命令行终端,输入python3 1.py 和输入python3 ./(上级目录)/ .py,它们的工作目录就会不一样】
import os b = os.getcwd() print(b) >>>D:\学习笔记\新职课\第五章-模块,包与库训练\第二节\作业 ## 如果在当前目录执行这个脚本文件,那么getcwd获取的就是当前的文件目录 # 如果把执行的目录切换到其它位置,在执行当前脚本,那么获取的就是你执行这个脚本时的目录
-
os.chdir() 修改当前的工作目录
【和用cd修改目录是一样的】
import os print(os.getcwd()) os.chdir('D:\学习笔记\新职课\第五章-模块,包与库训练\第二节') print(os.getcwd()) >>>D:\学习笔记\新职课\第五章-模块,包与库训练\第二节\作业 D:\学习笔记\新职课\第五章-模块,包与库训练\第二节
-
os.listdir() 获取当前或指定目录中的所有项(文件,文件夹,隐藏文件),返回列表
【不指定目录时,默认为当前的工作目录
== linux 中的 ls -a
== windows dir】
import os print(os.listdir()) #不指定目录时,默认为当前的工作目录 #print(os.listdir('./')) 也是指当前目录 os.chdir('D:\学习笔记\新职课\第五章-模块,包与库训练\第二节') print(os.listdir()) print(os.listdir('D:\学习笔记\新职课\第五章-模块,包与库训练')) >>>['data.txt', 'test.py', 'test.txt'] ['作业', '文档', '素材'] ['.idea', '第一节', '第一节笔记-File操作.md', '第二节', '第二节笔记-内置模块.md']
-
os.mkdir(文件夹路径,权限) 在文件夹路径中创建文件夹,默认为当前工作目录,当文件夹已经存在时无法创建
【对windows来说,这个“权限”是没任何作用的】
【无法递归创建,如果前面的文件夹不存在则创建失败】
【递归创建需要用os.makedirs()】
import os print(os.getcwd()) os.mkdir('aa') >>>D:\学习笔记\新职课\第五章-模块,包与库训练\第二节\作业 #此时就在这个目录下创建了文件夹aa os.chdir('D:\学习笔记\新职课\第五章-模块,包与库训练\第二节\作业\\aa') os.mkdir('ab',0o777) #此时就在aa的目录下创建了文件夹ab #注意这里的路径!作业后面要跟\\aa,需要用到反转义字符,输出\,取消\的转义效果
''' 关于系统中的文件权限,仅限linux系统 drwxr-xr-x 4 yc staff 128 11 27 11:40 aa dr----x--x 2 yc staff 64 11 27 11:42 abc 第一位 d代表是一个目录,如果是-则表示为一个文件 前三位的rwx 代表文件拥有人( user )的权限 中间三位的 r-x 代表文件所属组( group )的权限 最后三位的 r-x 代表其他人( other )的权限 其中 r w x 代表不同的操作权限,最高为7,777 分别代表 所有人,所属组,和其它 r 表示是否可读, 4 w 表示是否可写 2 x 表示是否可执行 1 注意:无法使用python去创建一个比自己这个进程权限还高的文件 '''
-
os.makedirs() 可以递归创建文件夹
import os os.makedirs('123\\455\\678') #此时就创建了123文件夹,里面有455文件夹,455文件夹里面有678文件夹
-
os.rmdir() 删除空文件夹:文件夹要为空
import os os.rmdir('ab') os.rmdir('123/455/678') #此时就删掉了之前建的为空的文件夹ab和123里的455里的678 #如果想删aa,会报错,因为aa里有空文件夹ab #只会删除目录里的最后一个空文件夹
-
os.removedirs() 递归删除空文件夹
【注意!如果只有最后一个文件夹为空,那么只会删除掉最后一个文件夹
因为删掉最后一个文件夹后,倒数第二个文件夹成为最后一个,而它不为空,则不会执行删除;
如果后一个空文件夹删除之后前一个为空,则可以一直删除】
import os os.removedirs('aa/ab') #文件夹可以用\,也可以用/ #此时把aa和ab一起删掉了 #注意在mac系统中: ''' 连续创建几个空文件 abc/ def/ aaa/ ./abc/def/aaa/ 在mac系统中连续创建了abc目录后又在里面创建def,又在def里面创建aaa 此时。使用os.removedirs('./abc/def/aaa/') 删除时,只删除了aaa。 为什么? 因为mac系统中的文件夹只要被使用过,都会默认创建一个隐藏文件 .DS_Store,因此这个文件夹不在是空文件夹了 '''
-
os.remove() 删除文件
import os os.remove('123/455/123.py') #此时就成功删除了123.py
-
os.rename() 修改文件或文件夹的名字
import os os.rename('123/455','456') #此时把123下的455修改成了和123同目录的456 #再重新建一个123/455 import os os.mkdir('123/455') os.rename('123/455','123/456') #此时就把123下的455改成了123下的456
-
os.system() 执行操作系统中的命令
import os os.system('dir') #就跟在linux系统中输入ls 或ls -a一样,返回当前工作目录中的所有文件和文件夹 import os os.system('python 1.py') #此时就能运行在当前工作目录下的1.py文件
3.2 os.path 系统模块中的路径模块
-
os.path.abspath(’./’) 将相对路径转化为绝对路径
import os a = os.path.abspath('./') print(a) >>>D:\学习笔记\新职课\第五章-模块,包与库训练\第二节\作业
-
os.path.basename() 获取路径中的主体部分 就是返回路径中的最后一部分
import os a = os.path.basename('D:\学习笔记\新职课\第五章-模块,包与库训练\第二节') print(a) >>>第二节
-
os.path.dirname() 获取路径中的路径部分,返回路径中最后一部分之前的内容。
【也就是主体所在的文件夹的路径】
import os a = os.path.dirname('D:\学习笔记\新职课\第五章-模块,包与库训练\第二节') print(a) >>>D:\学习笔记\新职课\第五章-模块,包与库训练
-
os.path.join() 链接多个路径,组成一个新的路径
import os a = os.path.join('./123/456/','1.py') print(a) >>>./123/456/1.py #显示的路径是拼接起来了,但是文件并没有被移进去
-
os.path.split() 拆分路径,把路径拆分为路径和主体部分
import os b = os.path.split('123/456') print(b) >>>('123', '456')
-
os.path.splitext() 拆分路径,可以拆分文件后缀名
import os a = os.path.join('./123/456/','1.py') b = os.path.split(a) c = os.path.splitext(a) d = os.path.splitext('123/456') print(b) print(c) print(d) >>>('./123/456', '1.py') ('./123/456/1', '.py') ('123/456', '') #没有就为空
-
os.path.getsize() 获取文件的大小,即字节数
import os b = os.path.getsize('123/1.py') print(b) >>>0 #因为里面什么都木有
-
os.path.isdir() 检测是否是一个文件夹是否存在
import os print(os.path.isdir('123/1.py')) print(os.path.isdir('123')) print(os.path.isdir('45')) >>>False True False #不存在或不为文件夹都会返回False
-
os.path.isfile() 检测文件是否存在
import os print(os.path.isfile('123/1.py')) print(os.path.isfile('123')) >>>True False
-
os.path.exists() 检测路径是否存在,既可以检测文件,也可以检测路径
import os #b = os.path.isdir('123/1.py') print(os.path.exists('123/1.py')) print(os.path.exists('456')) print(os.path.exists('123/456')) print(os.path.exists('1/123/456')) >>>True True True False
-
os.path.samefile(a,b) 检测a,b这两个path路径是否同时指向了一个目标位置 (两个路径必须真实)
import os a = './123/1.py' b = 'D:\学习笔记\新职课\第五章-模块,包与库训练\第二节\作业/123/1.py' print(os.path.samefile(a,b)) >>>True
3.3 shutil 高级的文件操作模块:import shutil
import shutil
-
shutil.copy(要复制的文件,指定目录) :复制文件
import shutil shutil.copy('123/1.py','456') #此时1.py就被拷贝到了456文件夹下 shutil.copy('123/1.py','456/11.py') #此时1.py就被拷贝到了456文件夹下,名字为11.py #如果想拷贝到的文件夹不存在则报错
-
shutil.copy2 和copy方法一样,可以把拷贝文件到指定目录,不同的是它保留了原文件的信息:操作时间(创造时间、修改时间等)和权限
-
shutil.copyfile() 拷贝文件的内容(打开文件,读取内容,写入到新的文件中)
-
shutil.copytree() 可以把整个目录结构和文件全部拷贝到指定目录中,但是要求指定的目标目录必须不存在
import shutil shutil.copytree('123','456/789') #之前为空的456文件夹中就多了一个789文件夹,里面是123文件夹里的所有内容【就是把123拷过来并且重命名为789】 【注意!如果只拷贝到456就会报错,因为要求拷贝到的指定的目录必须不存在!】
-
shutil.rmtree() 删除整个文件夹
import shutil shutil.rmtree('456/789') #此时就把刚刚拷贝过来的789文件夹删掉啦
-
shutil.move() 移动文件或文件夹到指定目录,也可以用于修改文件夹或文件的名称
import shutil shutil.move('123/456','457') #此时把123下的456修改成了和123同目录的457 【那么和os.rename()有什么区别呢?】 【下面这个图就是区别,大概意思就是shutil.move()比os.rename()更强一点8】
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TKoWYL8J-1593491968468)(D:\学习笔记\放在typora里的图片\235FFA12-82DA-4f2e-A5CA-E36EF0FA313B.png)]
4.zipfile 压缩模块:import zipfile
import zipfile
zipfile.ZipFile(路径包名,'w'(压缩)或'r'(解压))
-
压缩文件的操作:zipfile.ZipFile(路径包名,‘w’)
import zipfile with zipfile.ZipFile('yasuo.zip','w') as myzip: myzip.write('data.txt') #必须一个一个分开写,在一个括号里写多个文件,只会压缩最后一个文件进压缩包 myzip.write('test.txt') #用with关键字就不用再写个close语句了 #此时在工作目录下就创建了yasuo.zip,里面就是date.txt和test.txt这俩文件 #如果创建的压缩包名已经存在,则会覆盖
-
解压文件的操作:zipfile.ZipFile(路径包名,‘r’)
import zipfile with zipfile.ZipFile('yasuo.zip','r') as myzip: myzip.extractall() #默认为当前工作目录,也可以在括号里写其他目录 #此时就把压缩包里的文件解压到当前文件夹,如果文件已经存在,则会覆盖
myzip.extractall()是解压全部 myzip.extract()是只提取一个,括号里必须写要提取的文件名
-
如何压缩当前文件夹中的所有文件?
【第一种方法:】
import zipfile,os with zipfile.ZipFile('yasuo.zip','w') as myzip: a = os.listdir('./') for i in a: myzip.write(i) #此时就把当前工作目录里的所有文件和文件夹都压缩到了yasuo.zip文件里
-
使用shutil模块进行压缩:【第二种方法】
shutil.make_achive(参数1,参数2,参数3) #参数1:创建的压缩文件名称 #参数2:指定的压缩格式:zip,tar #参数3:要压缩的文件或文件夹目录,可不写,默认为当前工作目录
import shutil shutil.make_archive('yasuo','zip') #此时就把当前工作目录里的所有文件和文件夹都压缩到了yasuo.zip文件里
le
with zipfile.ZipFile(‘yasuo.zip’,‘r’) as myzip:
myzip.extractall() #默认为当前工作目录,也可以在括号里写其他目录
#此时就把压缩包里的文件解压到当前文件夹,如果文件已经存在,则会覆盖
```python
myzip.extractall()是解压全部
myzip.extract()是只提取一个,括号里必须写要提取的文件名
-
如何压缩当前文件夹中的所有文件?
【第一种方法:】
import zipfile,os with zipfile.ZipFile('yasuo.zip','w') as myzip: a = os.listdir('./') for i in a: myzip.write(i) #此时就把当前工作目录里的所有文件和文件夹都压缩到了yasuo.zip文件里
-
使用shutil模块进行压缩:【第二种方法】
shutil.make_achive(参数1,参数2,参数3) #参数1:创建的压缩文件名称 #参数2:指定的压缩格式:zip,tar #参数3:要压缩的文件或文件夹目录,可不写,默认为当前工作目录
import shutil shutil.make_archive('yasuo','zip') #此时就把当前工作目录里的所有文件和文件夹都压缩到了yasuo.zip文件里