Python学习_5 (内置模块)

系统内置模块就是按照python解释器后,系统给提供的模块
在需要时可以导入后使用,例如:json、re、os…

一. 序列化模块

序列化是指可以把python中的数据、以文本或者二进制的方式进行转换,并且还能反序列化为原来的数据
文本序列化模块 json
二进制序列化模块 pickle

1. pickle 序列化
  • dumps()
  • loads()
# 序列化 - pickle
import pickle
'''
为什么要序列化?
    一般数据在程序与网络中进行传输和存储时,需要以更加方便的形式进行操作。因此需要对数据进行序列化
    
pickle 模块提供的函数
    dumps() 序列化,可以把一个python的任意对象序列化成为一个二进制
    loads() 反序列化,可以把一个序列化后的二进制数据反序列化为一个python的对象
    
    dump()  序列化,把一个数据对象进行序列化并写入到文件中
        参数1: 需要序列化的数据对象
        参数2: 写入的文件对象
        pickle.dump(var,fp)
    load()  反序列化,在一个文件中读取序列化后的数据,并且完成一个反序列化
        参数1: 读取的文件对象
        pickle.load(fp) 
'''
# 1.基本的语法
vars = 'i love you'  # b'\x80\x04\x95\x0e\x00\x00\x00\x00\x00\x00\x00\x8c\ni love you\x94.' <class 'bytes'>
vars = [1,2,3,4]  # b'\x80\x04\x95\r\x00\x00\x00\x00\x00\x00\x00]\x94(K\x01K\x02K\x03K\x04e.' <class 'bytes'>
# 序列化 ==> 二进制数据
res = pickle.dumps(vars)
print(res,type(res))

# 反序列化 ==> python对象
res = pickle.loads(res)
print(res,type(res))  # [1, 2, 3, 4] <class 'list'>
  • python 序列化与文件
# 2.如何把一个python数据进行序列化后写入文件?并且再次读取出来
vars = {'name':'张三','age':23,'sex':'m'}
res = pickle.dumps(vars)
with open('./data.txt','wb') as fp:
    fp.write(res)

# 3.如何把一个反序列化的二进制文件读取,并完成反序列化
with open('./data.txt','rb') as fp:
    res = fp.read()
vardict = pickle.loads(res)
print(vardict) # {'name': '张三', 'age': 23, 'sex': 'm'}
  • dump()
  • load()
# 使用pickle模块提供的方法完成 load、dump
# 写入数据
vars = {'name':'张三','age':23,'sex':'m'}
with open('./data2.txt','wb') as fp:
    # 此处调用pickle模块的方法
    pickle.dump(vars,fp)

# 读取数据
with open('./data2.txt','rb') as fp:
    newdict = pickle.load(fp)
print(newdict) # {'name': '张三', 'age': 23, 'sex': 'm'}
2. json 序列化

Json 是一个受JavaScript 的对象字面量语法启发的轻量级的数据交换格式
Json 在js语言中是一个对象的表示方法,和Python中的字典的定义规则和语法都很像
Json 在互联网中又是一种通用的数据交换,数据传输,数据定义的一种数据格式

'''
Python中提供的json模块,可以把一些符合转换的Python数据对象,转为json格式的数据
    json.dumps()
    json.loads()

    json.dump()
    json.load()
'''
import json
vardist = {'name':'admin','age':20,'sex':'男'}

# 使用json模块的 dumps方法 进行json格式的转换
res = json.dumps(vardist)
print(res,type(res)) # {"name": "admin", "age": 20, "sex": "\u7537"} <class 'str'>

# 使用 loads 方法进行反转化
res = json.loads(res)
print(res,type(res)) # {'name': 'admin', 'age': 20, 'sex': '男'} <class 'dict'>

# 写
vardist = [{'name':'admin','age':20,'sex':'男'},{'name':'aa','age':21,'sex':'女'}]
# with open('./data.json','w') as fp:
    # json.dump(vardist,fp)

# 读
with open('./data.json','r') as fp:
    new = json.load(fp)
print(new)  # [{'name': 'admin', 'age': 20, 'sex': '男'}, {'name': 'aa', 'age': 21, 'sex': '女'}]

二. 数学模块 Math

Python 中的内置数学模块Math,提供了很多的数学相关运算

import math

# math.ceil() 向上取整; 内置函数 round() 四舍五入
res = math.ceil(2.25)
print(res) # 3
res = round(2.25) # 四舍五入
print(res) # 2

# math.floor() 向下取整,
res = math.floor(2.55)
print(res) # 2

# math.pow() 计算一个数字的n次方,结果是浮点数
res = math.pow(2,3)
print(res) # 8.0

# math.sqrt() 开平方运算,结果是浮点数
res = math.sqrt(16)
print(res) # 4.0

# math.fabs() 计算绝对值,结果是浮点数
res = math.fabs(-100)
print(res) # 100.0

# math.modf() 把一个数值拆分成小数和整数组成的元组
res = math.modf(3.1415)
print(res) # (0.14150000000000018, 3.0)

# math.copysign(x,y) 把第二个参数的正负符号拷贝给第一个参数,结果是浮点数
res = math.copysign(3.15,-99)
print(res) # -3.15

# math.fsum() 将一个容器类型数据中的元素,进行求和运算,结果是浮点数
res = math.fsum([1,2,3]) # 注意:容器中的元素必须是可运算的Number类型
print(res) # 6.0

# math.factorial(x) 以一个整数返回 x 的阶乘
res = math.factorial(4)
print(res)

# math.pi 数学常数 π = 3.141592...,精确到可用精度
print(math.pi) # 3.141592653589793

三. 随机模块 random

# 随机模块 random
import random

# random.random 返回 0-1 之间的随机小数 (左闭右开)
res = random.random()
print(res)

# random.rangrange(start,end,[step]) 随机获取指定范围内的整数
res = random.randrange(5) # 一个参数,从0到整数之间的值(左闭右开)
res = random.randrange(5,10) # 两个参数,从5到10到整数之间的值(左闭右开)
res = random.randrange(5,10,2) # 三个参数,按照步进值从5到10到整数之间的值(左闭右开)
print(res)

# random.randint() 随机产生指定范围内的随机整数
res = random.randint(5,10)

# random.uniform() 随机产生指定范围内的随机小数
res = random.uniform(5,10)

# random.choice() 随机获取容器类型中的值
res = random.choice('abd')
res = random.choice([1,2,3,4])

# random.shuffle() 随机打乱当前列表中的值,无返回值,直接打乱原数据
arr = [1,2,3,4]
res = random.shuffle(arr)
print(arr) # [1, 3, 2, 4]

四. 系统接口模块 os

  • os — 操作系统接口模块
import os

# os.getcwd() 获取当前的工作目录,注意获取的不是当前脚本的目录
print(os.getcwd()) # D:\PyCharm\Code\Oct19\day2
# os.getcwd() 返回二进制
print(os.getcwdb()) # b'D:\\PyCharm\\Code\\Oct19\\day2'

# os.chdir() # 修改当前的工作目录
os.chdir('D:\PyCharm\Code')
print(os.getcwd()) # D:\PyCharm\Code

# os.listdir() 获取当前或指定目录中的所有项(文件、文件夹、隐藏文件)组成的列表
# linux: ls -al  window: dir
print(os.listdir()) # ['demo1', 'Oct19'] 不指定目录,则默认当前
print(os.listdir('D:\PyCharm\Code\Oct19')) # ['.idea', 'day1', 'day2', 'main.py', '笔记.md']
  • 文件权限
'''
系统中的文件权限,仅限linux系统
    第一位 d代表是一个目录,如果是 - 则表示为一个文件
    前三位 rwx 代表文件所有人(u)的权限
    中间三位 r-x 代表文件所属组(g)的权限
    最后三位 r-x 代表其他人(o)的权限
    
    r 是否可读
    w 是否可写
    x 是否可执行
'''
# os.mkdir('\PyCharm\Code\Oct19\cest',mode=0o777)
  • 创建文件夹
# 创建文件夹
# os.mkdir()
os.mkdir('aa') # 默认在工作目录创建一个文件夹
# os.mkdir('D:\PyCharm\Code\Oct19\a\b\c') # 不能递归创建

# 递归创建文件夹
os.makedirs('/PyCharm/Code/Oct19/cest/aa/bb/cc')
  • 删除文件夹
# os.rmdir() 删除 空 文件夹,不能删除含有文件or文件夹的目录
os.mkdir('/a')
os.rmdir('/a')
# os.rmdir('/b')    OSError: [WinError 145] 目录不是空的。: '/b'

# os.removedirs() 递归删除空文件夹
os.removedirs('/PyCharm/Code/Oct19/cest/aa/bb/cc')
  • 更改文件夹或文件名
# os.rename() 修改文件或文件夹的名字
os.rename('/PyCharm/Code/Oct19/day2/a','/PyCharm/Code/Oct19/day2/aaa')
  • 执行操作系统中的命令
# os.system(‘命令 python3 xxx.py’) 执行操作系统中的命令
os.system('ls')
os.path
  • 一些路径相关的操作
# os.path 系统模块中的路径模块
import os

# 将相对路径转化为绝对路径
res = os.path.abspath('./')
print(res) # D:\PyCharm\Code\Oct19\day2

# 获取路径中的主体部分
res = os.path.basename('/PyCharm/Code/Oct19/day2')  # day2
res = os.path.basename('/PyCharm/Code/Oct19/day2/data.txt') # data.txt
print(res) # day2

# 获取路径中的路径,返回路径中最后一部分之前的内容
res = os.path.dirname('/PyCharm/Code/Oct19/day2/data.txt')
print(res) # /PyCharm/Code/Oct19/day2

# join() 连接多个路径,组成一个新的路径
res = os.path.join('./a/b/c/','2.jpg')
print(res)

# split() 拆分路径,把路径拆分为路径和主体部分
res = os.path.split('./a/bbb/ccc')
print(res) # ('./a/bbb', 'ccc')

# splitext() 拆分路径,可以拆分文件后缀名
res = os.path.splitext('./a/b/c/2.jpg') # ('./a/b/c/2', '.jpg')
res = os.path.splitext('./a/b/c/2') # ('./a/b/c/2', '')
print(res)

# os.path.getsize() 获取文件的大小
# res = os.path.getsize('./a/b/c/2.jpg') # 指定不存在路径会报错
# FileNotFoundError: [WinError 3] 系统找不到指定的路径。: './a/b/c/2.jpg'
res = os.path.getsize('./data.txt')
print(res) # 50

# os.path.isdir() 检测是否是一个文件夹
res = os.path.isdir('./data.txt') # False
res = os.path.isdir('./a/bbb') # True
print(res)

# 检测文件是否存在 ***
res = os.path.isfile('./data.txt') # True
res = os.path.isfile('./a/b/c/2.jpg') # False 文件不存在
print(res)

# os.path.exists() 检测路径是否存在,既可以检测文件,也可以检测路径 ***
res = os.path.exists('./data.json')
print(res)

# os.path.samefile(a,b) 检测两个path路径是否同时指向同一个目标 (两个路径必须真实)
a = './a/bbb/b.txt'
b = './a/bbb/b.txt'
res = os.path.samefile(a,b)
print(res) # True

五. 高级文件操作模块 shutil

# 高级模块 shutil
import shutil

# copy 复制文件 把一个文件拷贝到指定目录中,文件不存在会报错
shutil.copy('./data.json','./a/bbb/data1.json')

# copy2 和 copy 方法一样,可以拷贝文件到指定目录,保留了原文件的信息 (操作时间和权限等)

# copyfile 拷贝文件的内容 (打开文件,读取内容,写入到新的文件中)

# copytree(a,b) 可以把整个目录结构和文件全部拷贝到指定目录中,但指定的目标文件夹b必须不存在
shutil.copytree('./a','./b')

# rmtree 删除整个文件夹
shutil.rmtree('./b')

# move 移动文件或文件夹到指定目录,也可以用于修改文件或文件夹的名称
shutil.move('./a/bbb/b.txt','./a/bbb/ccc') # 移动
shutil.move('./a/bbb/ccc/b.txt','./a/bbb/ccc/rename.txt') # 改名

六. 压缩模块 zipfile

  • 压缩
# 压缩模块 zipfile
import zipfile,os

# 压缩文件
'''
zipfile.ZipFile(路径包名,模式,压缩或打包)
    
'''
# with zipfile.ZipFile('spam2.zip','w',zipfile.ZIP_DEFLATED) as myzip:
#     myzip.write('../day2/data.json')
#     myzip.write('../day2/data.txt')
#     myzip.write('../day2/data2.txt')

# 压缩当前文件夹中的所有文件
with zipfile.ZipFile('allfile.zip','w',zipfile.ZIP_DEFLATED) as myall:
    # 获取目录中所有的项`在这里插入代码片`
    arr = os.listdir('../day2')
    for i in arr:
        print(i)
        myall.write('../day2/'+i)
  • 解压
# 解压文件
with zipfile.ZipFile('spam.zip','r') as myzip:
    myzip.extractall('./aa')
''' 使用shutil模块进行归档压缩 '''
import shutil
# 参数1 创建的压缩文件名称  参数2 指定的压缩模式 zip,tar  参数3 要压缩的文件或文件夹目录
shutil.make_archive('b','tar','./')

七. 时间模块 time

import time

'''
概念:
    1.时间戳 表示从1970年1月1日0时0分0秒到现在的一个秒数,目前可以计算到2038年
'''
# 1、获取当前系统的时间戳 ***
res = time.time() # # 1647245631.6747496

# 2、获取当前系统时间,时间字符串(可以传参)
res = time.ctime() # Mon Mar 14 16:15:37 2022

# 3、获取当前系统时间,时间元组
res = time.localtime() # time.struct_time(tm_year=2022, tm_mon=3, tm_mday=14, tm_hour=16, tm_min=16, tm_sec=33, tm_wday=0, tm_yday=73, tm_isdst=0)

# 以上时间字符串和时间元组可以通过指定的时间戳来获取
t = 1567200631.6747496
res = time.ctime(t)
res = time.localtime(t)
print(res) # Sat Aug 31 05:30:31 2019

# 4、使用localtime方法获取时间元组,如何格式化为 xxxx年xx月xx日 时:分:秒
print(f'{res.tm_year}年{res.tm_mon}月{res.tm_mday}日 {res.tm_hour}时:{res.tm_min}分:{res.tm_sec}秒 星期{res.tm_wday+1}')

# 5、strftime(格式) 格式化时间 年-月-日 时:分:秒 ***
res = time.strftime('%Y-%m-%d %H:%M:%S 周%w')
print(res)

# 6、sleep(秒) 时间睡眠,可以暂停当前线程的执行
# time.sleep(3)

# 7、计算程序的运行时间
t1 = time.perf_counter()
for i in range(10000000):
    if 100 > 99:
        pass
t2 = time.perf_counter()
print(t2-t1) # 0.7825662

八. 日历模块 calendar

import calendar

# calendar.monthrange(year, month)
# 返回指定年份和月份的数据,月份的第一天是周几,和月份中的天数
year = 2022
month = 3
res = calendar.monthrange(year,month)
days = res[1] # 当前月份的天数 30
w = res[0]+1# 当前月份第一天的周信息
print(f'====== {year}年 ====== {month}月 ====')
print(' 一   二  三  四   五  六  日')
print('*'*28)
# 实现日历信息的输出
d = 1
# flag = 1 # 第一次循环周
while d <= days:
    # 循环周
    for i in range(1,8):
        # 判断是否输出
        if d > days or (d==1 and i<w):
            print(' '*2,end="  ")
        # elif w > i and flag == 1:
        #     print('**', end="  ")
        else:
            print(' {:0>2d} '.format(d), end='')
            d += 1
    print()
    # flag+=1

print('*'*28)

'''
====== 2022年 ====== 3月 ====
 一   二  三  四   五  六  日
****************************
     01  02  03  04  05  06 
 07  08  09  10  11  12  13 
 14  15  16  17  18  19  20 
 21  22  23  24  25  26  27 
 28  29  30  31             
****************************

'''
  • 万年历练习
# 将之前获取日历的方法封装为函数showdate(year,month)

# 获取当前系统的年月
dd = time.localtime()
year = dd.tm_year
month = dd.tm_mon

while True:
    os.system('cls')
    # 默认输出当前的年月日历
    showdate(year,month)
    print('<上一月    下一月>')
    # 获取用户输入
    c = input('请输入您的选择:< or >')
    # 判断用户输入
    if c == '<':
        month -= 1
        if month < 1:
            month= 12
            year-=1
    elif c == '>':
        month += 1
        if month > 12:
            month=1
            year+=1
    else:
        print('输入错误,请重新输入')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值