系统内置模块

系统内置模块就是安装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文件里