欧2020

导航

python学习记录(六)-系统内置模块

序列化

什么是序列化?序列化是指把python中的数据以文本或二进制形式进行转换,还能反序列化为原来的数据
为什么需要序列化?便于数据在程序与网络之间的传输和存储
json:文本序列化
pickle:二进制序列化

pickle序列化

import pickle
vars = 'abc'
# 序列化
res = pickle.dumps(vars)
print(res,type(res)) # b'\x80\x03X\x03\x00\x00\x00abcq\x00.' <class 'bytes'>
# 反序列化
res = pickle.loads(res)
print(res,type(res)) # abc <class 'str'>
# 序列化后写入文件
vardict = {'a':1,'b':2}
with open('./2.txt','wb') as fp:
    pickle.dump(vardict,fp)
# 读取文件并反序列化
with open('./2.txt','rb') as fp:
    res = pickle.load(fp)
print(res) # {'a': 1, 'b': 2}

json序列化

import json
vardict = {'name':'张三','age':18}
# 序列化
res = json.dumps(vardict)
print(res,type(res)) # {"name": "\u5f20\u4e09", "age": 18} <class 'str'>
# 反序列化
res = json.loads(res)
print(res) # {'name': '张三', 'age': 18}
# 序列化后写入文件
with open('./2.txt','w',encoding='utf-8') as fp:
    json.dump(vardict,fp)
# 读取文件并反序列化
with open('./2.txt','r',encoding='utf-8') as fp:
    res = json.load(fp)
print(res) # {'name': '张三', 'age': 18}

数学模块math

import math
# 向上取整
print(math.ceil(2.4)) # 3
# 向下取整
print(math.floor(2.4)) # 2
# 次方
print(math.pow(2,3)) # 8.0
# 开平方
print(math.sqrt(4)) # 2.0
# 绝对值
print(math.fabs(-8)) # 8.0
# 拆分成小数和整数组成的无组
print(math.modf(3.14)) # (0.14000000000000012, 3.0)
print(math.modf(3)) # (0.0, 3.0)
# 第2个参数的符号赋给第1个参数
print(math.copysign(2,-5)) # -2.0
print(math.copysign(-2,5)) # 2.0
# 求和
print(math.fsum([1,2,3])) # 6.0
# 阶乘(1*2*3*4)
print(math.factorial(4)) # 24
# 常数pai
print(math.pi) # 3.141592653589793

随机模块random

import random
# 返回[0,1)之间的小数
print(random.random()) # 0.24414562957962638
# 返回[0,9)之间的整数
print(random.randrange(9)) # 5
# 返回[2,9)之间的整数
print(random.randrange(2,9)) # 8
print(random.randint(2,9)) # 4
# 返回[2,9)步进值是2之间的整数
print(random.randrange(2,9,2)) # 4
# 返回[2,9)之间的小数
print(random.uniform(2,9)) # 4.383964391698797
# 返回指定容器中的数据
print(random.choice([1,5,2,3,10,25])) # 10
# 随机打乱容器中的顺序
varlist = [1,2,3,4,5]
random.shuffle(varlist)
print(varlist) # [5, 3, 2, 4, 1]

操作系统接口模块os-1

import os
# 获取当前工作目录
print(os.getcwd()) # C:\Users\OSAN\Desktop\code
# 修改当前工作目录
os.chdir('D:')
print(os.getcwd()) # D:\
# 获取当前或指定目录中所有项,相当于dir
print(os.listdir())
print(os.listdir('E:\project'))
# 创建文件夹(不能递归创建)
os.mkdir('aaa') # 在当前工作目录下创建文件夹aaa
os.mkdir(r'E:\aaa') # 在指定目录下创建文件夹aaa
# 创建文件夹(可以递归创建)
os.makedirs(r'abc\a\b\c') # 在当前工作目录下创建文件夹abc\a\b\c

操作系统接口模块-os2

import os
os.chdir('D:') # 修改当前工作目录
os.makedirs(r'abc\a\b\c') # 创建目录abc\a\b\c
# 删除文件夹(不能递归)
os.rmdir('abc') # OSError: [WinError 145] 目录不是空的。: 'abc'
os.rmdir(r'abc\a\b\c') # 成功删除c文件夹
# 删除文件夹(可以递归)
os.removedirs('abc') # OSError: [WinError 145] 目录不是空的。: 'abc'
os.removedirs(r'abc\a\b') # 成功删除abc文件夹
# 删除文件
os.remove('1.txt')
# 重命名文件或文件夹
os.rename('a.txt','b.txt')
os.rename('other','other2')
# 执行系统命令
os.system('control') # 打开控制面板

操作系统接口模块-os.path

import os
# 相对路径转为绝对路径
print(os.path.abspath('./')) # C:\Users\OSAN\Desktop\code
# 返回路径中最后一部分
print(os.path.basename(r'C:\Users\OSAN\Desktop\code')) # code
print(os.path.basename(r'C:\Users\OSAN\Desktop\code\a.txt')) # a.txt
# 返回路径中最后一部分之前的路径
print(os.path.dirname(r'C:\Users\OSAN\Desktop\code')) # C:\Users\OSAN\Desktop
print(os.path.dirname(r'C:\Users\OSAN\Desktop\code\a.txt')) # C:\Users\OSAN\Desktop\code
# 拼接路径
print(os.path.join(r'C:\Users\OSAN\Desktop','a.txt')) # C:\Users\OSAN\Desktop\a.txt
# 拆分路径
print(os.path.split(r'C:\Users\OSAN\Desktop\code')) # ('C:\\Users\\OSAN\\Desktop', 'code')
print(os.path.split(r'C:\Users\OSAN\Desktop\code\a.txt')) # ('C:\\Users\\OSAN\\Desktop\\code', 'a.txt')
# 拆分路径文件后缀名
print(os.path.splitext(r'C:\Users\OSAN\Desktop\code')) # ('C:\\Users\\OSAN\\Desktop\\code', '')
print(os.path.splitext(r'C:\Users\OSAN\Desktop\code\a.txt')) # ('C:\\Users\\OSAN\\Desktop\\code\\a', '.txt')
# 获取文件大小(字节)
print(os.path.getsize('./2.txt')) # 35
print(os.path.getsize('./我是一个不存在的文件.txt')) # FileNotFoundError: [WinError 2] 系统找不到指定的文件。: './我是一个不存在的文件.txt'
# 检测文件夹是否存在
print(os.path.isdir(r'C:\Users\OSAN\Desktop\code')) # True
# 检测文件是否存在
print(os.path.isfile('./2.txt')) # True
# 检测路径是否存在(文件夹和文件都可以)
print(os.path.exists(r'C:\Users\OSAN\Desktop\code')) # True
print(os.path.exists('./2.txt')) # True
# 检测两个路径是否指向同一个文件
r1 = r'C:\Users\OSAN\Desktop\code\2.txt'
r2 = r'C:\Users\OSAN\Desktop\..\Desktop\code\2.txt'
print(os.path.samefile(r1,r2)) # True

高级文件操作模块-shutil

import shutil
# 复制文件
shutil.copy('./old.txt','D:/new.txt')
shutil.copy2('./old.txt','D:/new2.txt') # 创建时间、权限等一并复制
shutil.copyfile('./old.txt','D:/new3.txt') # 打开文件,读取内容,写入新文件中
# 复制整个目录结构和文件
shutil.copytree('./a','./b')
# 删除整个目录结构和文件
shutil.rmtree('./b')
# 移动文件夹和文件
shutil.move('./a','./b')

压缩模块-zipfile

import zipfile
# 压缩
with zipfile.ZipFile('./newpack.zip','w',zipfile.ZIP_DEFLATED) as myzip:
    myzip.write('./1.txt')
    myzip.write('./2.txt')
# 解压缩
with zipfile.ZipFile('./newpack.zip','r') as myzip:
    myzip.extractall('./')
# 文件夹压缩
import shutil
shutil.make_archive('newpack','zip','./')

时间模块-time

import time
# 时间戳(从1970年1月1日0时0分0秒到现在的秒数)
print(time.time()) # 1608636615.5876932
# 当前系统时间(时间字符串)
print(time.ctime()) # Tue Dec 22 19:31:38 2020
print(time.ctime(1608636615.5876932)) # Tue Dec 22 19:30:15 2020
# 当前系统时间(时间元组)
print(time.localtime()) # time.struct_time(tm_year=2020, tm_mon=12, tm_mday=22, tm_hour=19, tm_min=33, tm_sec=38, tm_wday=1, tm_yday=357, tm_isdst=0)
print(time.localtime(1608636615.5876932)) # time.struct_time(tm_year=2020, tm_mon=12, tm_mday=22, tm_hour=19, tm_min=30, tm_sec=15, tm_wday=1, tm_yday=357, tm_isdst=0)
print(time.localtime().tm_year) # 2020
# 时间格式化
print(time.strftime('%Y-%m-%d %H:%M:%S %w')) # 2020-12-22 19:48:30 2
# 睡眠(秒)
print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2020-12-22 19:56:06
time.sleep(3)
print(time.strftime('%Y-%m-%d %H:%M:%S')) # 2020-12-22 19:56:09
# 程序运行时间(秒)
start = time.perf_counter()
for i in range(10000):
    i += 1
end = time.perf_counter()
print(end-start) # 0.00393660000000029

日历模块-calendar

import calendar
res = calendar.monthrange(2020,12)
week = res[0] + 1
days = res[1]
print(f'2020年12月一共{days}天,第1天是周{week}')

正则表达式

转义字符:
    \w 单个 字母、数字、下划线    \W 单个 非字母、非数字、非下划线
    \d 单个 数字               \D 单个 非数字
    \s 单个 空白符、制表符       \S 单个 非空白符、非制表符
特殊字符:
    . 单个 任意字符,除了换行符
    * 匹配次数 任意次数(包括0次)
    + 匹配次数 至少一次
    ? 拒绝贪婪 前面的匹配规则只要达成即可
    {}匹配次数
    []取值范围
    ()子组提取,在整个匹配结果中用res.groups()再单独提取()中的内容
    ^限制开头
    $限制结尾
模式:I U
import re
# 基本操作
varstr = 'wo123de45ma6ya78'
reg1,reg2,reg3 = '123','\d','\d\d' # \d代表单个数字
print(re.findall(reg1,varstr)) # ['123']
print(re.findall(reg2,varstr)) # ['1', '2', '3', '4', '5', '6', '7', '8']
print(re.findall(reg3,varstr)) # ['12','45','78']
# 左匹配
print(re.match('123',varstr)) # None
res = re.match('wo123',varstr)
print(res) # <re.Match object; span=(0, 5), match='wo123'>
print(res.group(),res.span()) # wo123 (0, 5)
# 搜索(从头开始找到第一个结束)
res = re.search('wo123',varstr)
print(res) # <re.Match object; span=(0, 5), match='wo123'>
print(res.group(),res.span()) # wo123 (0, 5)
# 找所有(返回列表)
varstr = 'abc12ab34bcd'
print(re.findall('ab',varstr)) # ['ab', 'ab']
# 找所有(返回跌代器)
res = re.finditer('ab',varstr)
print(list(res)) # [<re.Match object; span=(0, 2), match='ab'>, <re.Match object; span=(5, 7), match='ab'>]
# 搜索替换
print(re.sub('ab','AB',varstr)) # ABc12AB34bcd
# 数据切割
print(re.split('\d{2}',varstr)) # ['abc', 'ab', 'bcd']
# 使用正则对象直接操作
reg = re.compile('\d{2}')
print(reg.search(varstr).group()) # 12
import re
print(re.search('\d*','abc123bcd4')) # <re.Match object; span=(0, 0), match=''>
print(re.search('\d*','123bcd4')) # <re.Match object; span=(0, 3), match='123'>
print(re.search('\d+','abc123bcd4')) # <re.Match object; span=(3, 6), match='123'>
print(re.search('\d+?','abc123bcd4')) # <re.Match object; span=(3, 4), match='1'>
print(re.search('\d*?','123bcd4')) # <re.Match object; span=(0, 0), match=''>
print(re.search('\d{2}','abc123bcd4')) # <re.Match object; span=(3, 4), match='12'>
print(re.search('\d{2,5}','abc123234')) # <re.Match object; span=(3, 4), match='12323'>
print(re.search('[a-zA-Z0-9_]','abc123234')) # <re.Match object; span=(3, 4), match='a'>
res = re.search('\d(\w{2})','123bcd4')
print(res,res.groups()) # <re.Match object; span=(0, 3), match='123'> ('23',)
print(re.search('^1\d{10}$','17332138792')) # <re.Match object; span=(0, 11), match='17332138792'>
# 正则模式-不区分大小写
print(re.search('[a-z]{5,10}','aABCdef')) # None
print(re.search('[a-z]{5,10}','aABCdef',re.I)) # <re.Match object; span=(0, 7), match='aABCdef'>

posted on 2020-12-31 10:57  欧2020  阅读(36)  评论(0编辑  收藏  举报