Python基础第六天
常用模块
os
系统交互模块,用python执行cmd命令,对操作系统进行访问
os.system() 主要用来写cmd指令
import os
os.system("echo hello,world") # hello world
print(os.getcwd()) # 获取当前python工作目录
os.mkdir("XX") # 在当前目录下创建名为XX的文件夹
os.rmdir("XX") # 删除名为XX的文件夹(只能删除空的文件夹)
os.remove('base_1.py') # 删除名为base_1的文件
os.rename('base_2.py','base_1.py') # 重命名文件,左边是原名,右边是新名
print(os.path.exists(path='base_6.py')) # 判断文件是否存在
print(os.path.isfile(path='base_6.py')) # 判断是否为文件
time
import time
print(time.time()) # 时间戳(1970年1月1日00:00:00到现在的秒数)
print(time.localtime()) # 返回一个时间元组
print(time.sleep(1)) # 休眠一秒钟。放慢程序进程,看起来更直观
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime())) # 2024-01-14 09:51:20,可以标识一个格式
%Y --> 年 %H --> 时
%m --> 月 %M --> 分
%d --> 日 %S --> 秒
random
import random
a = random.random()
print(a) # 0.4083126885775591,随机生成一个0到1的随机数
b = random.randint(1,10)
print(b) # 10,在此范围内随机生成一个整数(左闭右闭区间)
c = random.choice(['剪刀','石头','布'])
print(c) # 布,随机生成列表中一个值
c = random.choices(['剪刀','石头','布'],k=2)
print(c) # ['布', '剪刀'] 随机生成列表中两个值
d = random.uniform(1,10)
print(d) # 1.2652817321978196
li = [1, 2, 3, 4]
random.shuffle(li) # 打乱序列类型的顺序(字符串和元组就不可以打乱了,因为他们是不可变类型)
print(li) # [2, 3, 4, 1]
设计一个四位数随机验证码的函数
def yz():
yzm = ''
for i in range(4):
yzm += str(random.randint(0,9))
return yzm
print(yz())
json
文件的存储格式,跨语言,跨平台
序列化和反序列化
序列数据:机器码(0和1)
反序列数据:人们看的代码
import json
json_data = json.dumps([1, 2, 'XX','你好'])
print(json_data) # [1, 2, "XX", "\u4f60\u597d"]
print(type(json_data)) # <class 'str'>
data = json.loads(json_data) # 反序列化
print(data) # [1, 2, 'XX', '你好']
print(type(data)) # <class 'list'>,反序列化解码后
re正则表达式
普通字符和元字符构成的字符串,描述一类字符串规则。
import re
s1 = 'abcd'
par = 'ab'
res = re.match(par,s1)
print(res.group()) # ab,匹配出的结果
print(re.findall(par,s1)) # ['ab'],放到列表里面
元字符
匹配单字符
. 表示任意一个字符,除了\n
print(re.match('.','hello')) # match='h'
print(re.match('.','@hello')) # match='@'
print(re.match('..','hello')) # match='he'
print(re.match('.','\nhello')) # None
\d 表示0-9之间的任意一个数字
print(re.match('\d','0hello')) # match='0'
print(re.match('\d','h2ello')) # None
\D 表示非数字
print(re.match('\D','\nhello')) # match='\n'
print(re.match('\D','@hello')) # match='@'
print(re.match('\D','0hello')) # None
\s 表示空白字符串
print(re.match('\s',' hello')) # match=' '
print(re.match('\s','\n')) # match='\n'
print(re.match('\s','\t')) # match='\t'
\S 表示非空白字符
print(re.match('\S','\t')) # None
print(re.match('\S','\\')) # match='\\' (\\相当于\)
\w 表示英文字母、数字、下划线
print(re.match('\w','\\')) # None
print(re.match('\w','hello')) # match='h'
\W 表示非英文字母、数字、下划线
print(re.match('\W','\\')) # match='\\'
print(re.match('\W','hello')) # None
字符集 用中括号来表示字符范围来匹配单个字符
print(re.match('[abcd]','acdb')) # match='a'
print(re.findall('[abcd]','abz')) # ['a', 'b']
- 表示一个范围内
print(re.findall('[a-z]','abz')) # ['a', 'b', 'z']
print(re.findall('[a-zA-Z]','AabzB')) # ['A', 'a', 'b', 'z', 'B']
print(re.findall('[A-z]','AabzB')) # ['A', 'a', 'b', 'z', 'B']
print(re.findall('[0-9A-z]','5AabzB')) # ['5', 'A', 'a', 'b', 'z', 'B']
^ 表示取反、间接号
[^a-e] # 取a-e之外的
print(re.match('[^a-e]','z')) # match='z'
字符集的多字符匹配
print(re.match('[0-9][0-9]','25')) # match='25'
print(re.match('\d\w','2a')) # match='2a'
print(re.findall('[\w\W]','@c2\n')) # ['@', 'c', '2', '\n']
数量规则
import re
* 可以匹配多个字符
print(re.match('\d*','123456')) # match='123456' (贪婪模式)
+ 只能匹配1次以上,不能匹配0次
print(re.match('\d+','a123456')) # None
print(re.match('\d*','a123456')) # match=''
?匹配一个字符出现0次或者1次
print(re.match('\d?','')) # match=''
print(re.match('\d?','123')) # match='1'
次数匹配
{m} 匹配前m个字符
{m,} 至少匹配m次以上
{m,n} 匹配m次以上,n次以下
print(re.match('\d{5}','123456')) # match='12345'
print(re.match('\d{3,}','1234a56')) # match='1234'
print(re.match('\d{3,6}','12a3456')) # None
边界处理
^ 表示开始
$ 表示结束
print(re.match('^1[456][2-7]\d{8}' ,'15211012138')) # match='15211012138'
分组匹配
匹配日期
01 02 03 04 05 06 07 08 09 10 11 12
| 表示或者
t = '2022-12-21'
print(re.match('\d{4}-(0[0-9]|1[0-2])-\d{2}', t)) # match='2022-12-21'
print(re.match('(\d{4}-(0[0-9]|1[0-2])-\d{2})', t).group(1)) # 2022-12-21
r 规避\,防转义
context = '<title>hello</title>'
print(re.match(r'<title>([\w\W]*)</title>', context)) # match='<title>hello</title>'>
\1 表示第一个分组中的内容
print(re.match(r'<(\w+)>([\w\W]*)</\1>', context)) # match='<title>hello</title>'>
print(re.match(r'<(\w+)>([\w\W]*)</\1>', context).group(1)) # title
分组取别名 ?P<别名>
print(re.match(r'<(?P<tag>\w+)>([\w\W]*)</(?P=tag)>',context).group()) # <title>hello</title>
文件操作
操作文件的步骤:
- 打开文件
- 对文件进行操作,保存
- 关闭文件
打开
filename = 'demo.txt' # 复制绝对路径:右击文件按住Ctrl+Shift+C
demo = open(filename) # 只要没报错就是打开的
print(demo) # 假如和本程序不在同一个目录下就要在上面复制绝对路径
..表示上一级/
filename = r'../base_6/demo.text'
# 对于写路径的时候可以在前面加r来规避\
content = demo.read()
print(content)
print(type(content))
demo.close()
with open()...as 可以自动关闭
with open(filename) as f:
print(f.read())
print(f.read()) # 会报错,with执行结束后就会关闭
读取
文件分类:
- 1.纯文本文件(使用utf-8等编码编写的文本文件)
- 2.二进制文件(音乐、图片、视频)
filename = 'demo.txt'
with open(filename, encoding='utf-8') as f:
content = f.read(4)
content = f.read(4)
content = f.read(4) # 如果读取完了还继续读会返回空字符串
print(content)
读取一个大文件的规范写法:
filename = 'demo.txt'
with open(filename, encoding='utf-8') as f:
all_content = '' # 定义一个空字符串用来保存数据
while True:
content = f.read(5)
if content == '':
break
all_content += content
print(all_content) # 拿到读取的数据
对一行进行读取:
filename = 'demo.txt'
with open(filename, encoding='utf-8') as f:
print(f.readline(), end="") # 阻止print自带的换行
print(f.readline(), end="")
print(f.readline())
readlines():
filename = 'demo.txt'
with open(filename, encoding='utf-8') as f:
l = f.readlines() # 对每一行都进行了读取
print(l[1:3]) # 进行切片操作
写入
write()
open(file,mode='r')
r : 可读
w : 可写,会覆盖文件。如果文件不存在就会创建文件
a : 追加,文件不存在也会覆盖
b : 读取二进制文件
filename = 'demo1.txt'
with open(filename, 'w', encoding='utf-8') as f:
f.write('hello,world')
filename = 'demo1.txt'
with open(filename, 'a', encoding='utf-8') as f:
f.write('\n你好,世界')
二进制文件
filename = r'C:\Users\Lenovo\Desktop\联想截图_20230821221458.png'
with open(filename,'rb') as f:
new_path = 'qq.png'
with open(new_path,'wb') as new_f:
# 定义每次读取的大小
c = 1024*100 # 二进制模式基本单位是字节
while True:
content = f.read(c)
# 如果字节没有了就退出
if not content:
break
# 将读取的数据写入到新的对象中
new_f.write(content)
运行完之后会发现文件夹里多了的一个png就是这个图片