1 os模块的常见函数
1.1 概述
""" 扩展: os模块的常见函数. os模块概述: 概述: 全称叫: Operating System, 系统模块, 主要是操作: 文件夹, 文件等的.. 常用的函数如下: getcwd() 获取当前的工作目录. chdir() 修改当前工作目录. mkdir() 创建文件夹 os.path.isfile() 判断指定的路径 是否是 存在的 文件 os.path.isdir() 判断指定的路径 是否是 存在的 文件夹 """
1.2 案例
# 导包importos# 演示 os模块的常用函数.print(os.getcwd())# current work directory, 当前的工作目录.# \ 在Python中有特殊含义, 需要转义. 有三种写法.# 写法1: \\# os.chdir('d:\\abc') # 修改当前工作目录, 了解即可, 一般不改. change directory# 写法2: /# os.chdir('d:/abc')# 写法3: r'\'# os.chdir(r'd:\abc')print(os.getcwd())# current work directory, 当前的工作目录.# 文件夹不存在, 就创建, 存在就报错.# os.mkdir('d:/abc/aa') # make directory, 创建文件夹.# 删除文件夹 -> 文件夹必须为空# os.rmdir('d:/abc/aa') # remove directory, 删除文件夹.# 删除文件# os.remove('d:/abc/aa/1.txt')# 查看指定的目录下, 有哪些文件, 文件夹# print(os.listdir('d:/'))# 判断指定的路径是否存在.print(os.path.exists('d:/abc/aa/1.txt'))# Falseprint(os.path.exists('d:/abc'))# True# 判断指定的路径 是否是 存在的 文件print(os.path.isfile('d:/abc/aa/1.txt'))# False, 是文件, 但是不存在print(os.path.isfile(r'D:\图片\小猪.png'))# True# 判断指定的路径 是否是 存在的 文件夹print(os.path.isdir(r'D:\图片\小猪.png'))# Falseprint(os.path.isdir(r'D:\图片'))# True
2 编解码
2.1 概述
""" 编解码概述: 编码: 把我们看懂的内容 -> 我们看不懂, 但是计算机能看懂的内容. 解码: 把我们看不懂, 但是计算机能看懂的内容 -> 我们看懂的内容. 只要出现乱码问题, 原因只有1个: 编解码不一致. 细节(记忆): 中文 -> 在GBK码表中占 2个字节, 在UTF-8码表中占 3个字节. 数字, 字母, 特殊符号 -> 无论在什么码表, 都只占1个字节. """
2.2 案例
# 案例1: 演示 编码. my_str = '你好1aA!' # bytes = my_str.encode() # 默认码表 -> utf-8 b'\xe4\xbd\xa0\xe5\xa5\xbd1aA!' # bytes = my_str.encode('utf-8') # 指定码表 -> utf-8 b'\xe4\xbd\xa0\xe5\xa5\xbd1aA!' bytes = my_str.encode('gbk') # 指定码表 -> gbk b'\xc4\xe3\xba\xc31aA!' print(f'bytes: {bytes}') print('-' * 30) # 案例2: 演示 解码. # 1. 定义 字节形式的字符串. bys = b'\xe4\xbd\xa0\xe5\xa5\xbd1aA!' # 2. 演示解码. # result = bys.decode() # 默认码表 -> utf-8 # result = bys.decode('utf-8') # 指定码表 -> utf-8 result = bys.decode('gbk') # 指定码表 -> gbk # 3. 输出. print(f'result: {result}')
3 文件操作
3.1 文件中写数据
3.1.1 概述
""" 文件概述: 概述: 我们常用的Windows, Mac, Linux系统都是 文件操作系统, 即: 都是以文件的形式来管理数据的. 文件的常见操作: 1. 打开文件. f = open('文件的路径', '模式', '码表') 2. 读写数据. read() 读取数据 write() 写数据 3. 关闭文件. f.close() 关于往文件中 写 数据的操作: write(内容) 往文件中写入指定的数据. writelines(内容) 一次性往文件中写多行. """
3.1.2 案例
# import os # print(os.getcwd()) # D:\workspace\ai_45_bj\pythonProject\day06 # 1. 打开文件. # 写法1: 相对路径 # 参1: ./代表当前目录, 即: os.getcwd()的执行结果. 一般是: 当前项目的目录, 可省略不写. # 参2: 模式, w表示 只写, r表示 只读, a表示 追加 # 参3: 码表 f = open('./data/1.txt', 'w', encoding='utf-8') # 目的地文件不存在, 会自动创建 # 写法2: 绝对路径, 固定的, 写"死"的路径, 以 盘符 开头. # f = open(r'D:\workspace\ai_45_bj\pythonProject\day06\data\1.txt', 'w') # 2. 往文件中写数据. # f.write('abc\n') # f.write('xyz') f.write('命里有官, 书不用翻!') # 3. 释放资源(关闭文件) f.close()
3.2 文件中读数据
3.2.1 概述
""" 从文件中读取数据 相关函数如下: read(n) 不过不写n, 就一次读取文件所有数据, 如果写了, 就一次读取n个数据. readline() 一次读取一行, 封装成字符串, 包括最后的\n readlines() 一次读取所有行, 会把每行数据封装成1个字符串(包括\n), 然后整体放到1个列表中. 实际开发用的拷贝方式: 用 read(n) 一次读取n个数据, 可以是字符, 也可以是字节, 取决于你用的是 r 还是 rb 或者 操作纯文本文件的时候, 也可以用 readline() 一次读取一行. 用 write() 把上述读取到的数据写到文件中即可. """
3.2.2 案例
# 案例1: 演示读取的几种方式. # 1. 打开文件. f = open('data/1.txt', 'r', encoding='utf-8') # 2. 读取数据. # data = f.read() # 不指定长度, 就一次性读取所有数据. # data = f.read(5) # 指定长度, 一次读取5个字符 # data = f.readline() # 一次读取一行. data = f.readlines() # 一次读取所有行. # 3. 打印结果. print(data)
3.3 文件复制
3.3.1 概述
""" 拷贝文件 思路概述: 1. 创建文件对象, 关联: 数据源文件 2. 创建文件对象, 关联: 目的地文件 3. 一次性读取n个字符(字节), 所以用while循环实现. 4. 正常的读取数据即可, 读不到会返回空, 记得做判断. 5. 把上述读取到的数据, 写到目的地文件中. 6. 释放资源. """
3.3.2 案例
# 需求1: 把 1.txt -> 拷贝到 2.txt中 字符形式. # 1. 创建文件对象, 关联: 数据源文件 src_f = open('./data/1.txt', 'r', encoding='utf-8') # 2. 创建文件对象, 关联: 目的地文件 # dst_f = open('./data/2.txt', 'w', encoding='utf-8') # w: 覆盖写入 dst_f = open('./data/2.txt', 'a', encoding='utf-8') # a: 追加写入 # 3. 一次性读取n个字符(字节), 所以用while循环实现. while True: data = src_f.read(5) # 一次读取5个字符, 实际开发一般写 1024的倍数 # 4. 正常的读取数据即可, 读不到会返回空, 记得做判断. if not data: # 空值转布尔会转为 False, 取反后就是: True break # 5. 把上述读取到的数据, 写到目的地文件中. dst_f.write(data) # 6. 释放资源. src_f.close() dst_f.close() print('-' * 30) # 需求2: 把 1.txt -> 拷贝到 2.txt中 字节形式, 不需要指定码表. # 1. 创建文件对象, 关联: 数据源文件 src_f = open('./data/1.txt', 'rb') # 2. 创建文件对象, 关联: 目的地文件 dst_f = open('./data/2.txt', 'wb') # w: 覆盖写入 # 3. 一次性读取n个字符(字节), 所以用while循环实现. while True: data = src_f.read(5) # 一次读取5个字符, 实际开发一般写 1024的倍数 # 4. 正常的读取数据即可, 读不到会返回空, 记得做判断. if not data: # 空值转布尔会转为 False, 取反后就是: True break # 5. 把上述读取到的数据, 写到目的地文件中. dst_f.write(data) # 6. 释放资源. src_f.close() dst_f.close() print('-' * 30) # 需求3: 上述的字节形式, 也是通用的拷贝方式, 它能拷贝任意形式, 例如: 图片, 视频, 音频, 压缩包等等. # 需求: 拷贝图片. # 1. 创建文件对象, 关联: 数据源文件 src_f = open('./data/a.jpg', 'rb') # 2. 创建文件对象, 关联: 目的地文件 dst_f = open('./data/b.jpg', 'wb') # w: 覆盖写入 # 3. 一次性读取n个字符(字节), 所以用while循环实现. while True: data = src_f.read(5) # 一次读取5个字符, 实际开发一般写 1024的倍数 # 4. 正常的读取数据即可, 读不到会返回空, 记得做判断. if not data: # 空值转布尔会转为 False, 取反后就是: True break # 5. 把上述读取到的数据, 写到目的地文件中. dst_f.write(data) # 6. 释放资源. src_f.close() dst_f.close() print('-' * 30) # 需求4: 拷贝文本, 一次读写一行, 部分场景下可能会用到, 看看就行了, 起始就改1个地方. # 1. 创建文件对象, 关联: 数据源文件 src_f = open('./data/1.txt', 'r', encoding='utf-8') # 2. 创建文件对象, 关联: 目的地文件 dst_f = open('./data/2.txt', 'w', encoding='utf-8') # w: 覆盖写入 # 3. 一次性读取n个字符(字节), 所以用while循环实现. while True: data = src_f.readline() # 一次读取一行. # 4. 正常的读取数据即可, 读不到会返回空, 记得做判断. if not data: # 空值转布尔会转为 False, 取反后就是: True break # 5. 把上述读取到的数据, 写到目的地文件中. dst_f.write(data) # 6. 释放资源. src_f.close() dst_f.close()
3.4 with open语句
3.4.1 概述
'''with open语句概述: 格式: with open('路径', '模式', '码表') as 文件名, open(...) as 文件名 : 正常的读取操作的代码 特点: with..open()语句会在 它所管理的代码执行完毕后, 自动释放(open()打开的)资源. 本质: with后边写的内容是 上下文管理器对象, 这个目前了解, 就业班详解.'''
# 回顾: 拷贝文件的代码.# # 1. 创建文件对象, 关联: 数据源文件.# src_f = open('data/1.txt', 'r', encoding='utf-8')# # 2. 创建文件对象, 关联: 目的地文件.# dst_f = open('data/2.txt', 'w', encoding='utf-8')# # 3. 循环读取.# while True:# # 4. 具体的读取操作.# data = src_f.read(1024)# # 5. 判断读取到的数据是否为空, 为空就结束, 不为空就写入.# if not data:# break# dst_f.write(data)## # 6. 释放资源.# src_f.close()# dst_f.close()# 用 with.open 语句优化上述的代码.# 1. 创建文件对象, 关联: 数据源文件.# 2. 创建文件对象, 关联: 目的地文件.withopen('data/1.txt','r',encoding='utf-8')assrc_f,open('data/2.txt','w',encoding='utf-8')asdst_f:# 3. 循环读取.whileTrue:# 4. 具体的读取操作.data=src_f.read(1024)# 5. 判断读取到的数据是否为空, 为空就结束, 不为空就写入.ifnotdata:breakdst_f.write(data)
4 try-except语句
4.1 概述:
'''在Python中, 把程序出现的所有非正常情况称之为 异常(Exception), 俗称叫: Bug 异常的两种处理方式: 1. 我们不手动处理, 而是交给程序自动处理. 程序会: 将异常信息, 出现的原因, 位置打印到控制台上, 并终止程序的执行. 2. 我们手动处理, 处理之后, 程序会继续运行 -> 捕获异常. try.except语法.'''
4.2 try.except语法的完整格式
''' try: 里边写可能出问题的代码 except [异常类型 as 别名]: 出现问题后的解决方案 else: 如果程序没有出现问题, 就会执行这里的内容 finally: 无论程序是否有Bug, 都会执行这里的内容. '''
4.3 执行流程
''' 1. 先执行try中的内容, 看有无问题. 如果有问题: 会立即跳转到 except中进行执行. 如果无问题: 则try中内容执行完毕后, 会执行else中的内容. 2. 无论try中是否有问题, 都会执行finally中的内容. 图解: 出问题了, 走: except --- / \ try 无论try中是否有Bug, 最终肯定会走finally \ / 无问题, 走: else ----- 特点: 处理之后, 程序会继续往下执行. '''
4.4 猜数字案例
# 导包importrandom# todo 1.定义函数defguess_number_game():# 1. 生成1个随机数, 让用户来猜.guess_num=random.randint(1,100)# 2. 因为不知道用户多少次能猜对, 我们用: while循环.whileTrue:# 3. 判断本次猜数字是否有问题, 如果有问题, 就提示.try:# 4. 提示用户录入他/她要猜的数字, 并接受.input_num=int(input("请输入你要猜的数字: "))# 5. 判断用户输入的数字是否和随机数相等, 并提示.ifinput_num==guess_num:print("恭喜你, 猜对了!")breakelifinput_num>guess_num:print("你猜的数字太大了")else:print("你猜的数字太小了")except:print('哎呀, 录入有误, 请录入1 ~ 100之间的整数!')# main函数 = 程序的主入口, 所有的代码都是从这里开始执行的.if__name__=='__main__':# todo 2.调用函数guess_number_game()
4.5 完整案例
defdivision(a,b):"""除法函数,演示 try-except-else-finally 完整用法"""try:# 可能出错的代码:除法运算result=a/bprint(f"计算成功:{a}/{b}={result}")# 捕获【除零错误】(除数为0时触发)exceptZeroDivisionErrorase:print(f"出现异常:除数不能为 0!错误信息:{e}")# 捕获【类型错误】(传入非数字时触发)exceptTypeErrorase:print(f"出现异常:请输入数字!错误信息:{e}")# 【没有异常】才会执行else:print("🔹 else 执行:程序运行一切正常!")returnresult# 【无论是否异常】都会执行finally:print(" finally 执行:收尾工作(关闭文件/断开连接/清理资源)\n")# ------------------- 测试 1:正常情况 -------------------print("===== 测试 1:正常除法 10 / 2 =====")division(10,2)# ------------------- 测试 2:除零异常 -------------------print("===== 测试 2:除数为 0 10 / 0 =====")division(10,0)# ------------------- 测试 3:类型异常 -------------------print("===== 测试 3:传入字符串 10 / 'abc' =====")division(10,"abc")