11.os模块、编解码、文件操作、try-except语句详解

张开发
2026/4/12 0:10:01 15 分钟阅读

分享文章

11.os模块、编解码、文件操作、try-except语句详解
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(rd:\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(rD:\图片\小猪.png))# True# 判断指定的路径 是否是 存在的 文件夹print(os.path.isdir(rD:\图片\小猪.png))# Falseprint(os.path.isdir(rD:\图片))# True2 编解码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(fbytes: {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(fresult: {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, encodingutf-8) # 目的地文件不存在, 会自动创建 # 写法2: 绝对路径, 固定的, 写死的路径, 以 盘符 开头. # f open(rD:\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, encodingutf-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, encodingutf-8) # 2. 创建文件对象, 关联: 目的地文件 # dst_f open(./data/2.txt, w, encodingutf-8) # w: 覆盖写入 dst_f open(./data/2.txt, a, encodingutf-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, encodingutf-8) # 2. 创建文件对象, 关联: 目的地文件 dst_f open(./data/2.txt, w, encodingutf-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, encodingutf-8)# # 2. 创建文件对象, 关联: 目的地文件.# dst_f open(data/2.txt, w, encodingutf-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,encodingutf-8)assrc_f,open(data/2.txt,w,encodingutf-8)asdst_f:# 3. 循环读取.whileTrue:# 4. 具体的读取操作.datasrc_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_numrandom.randint(1,100)# 2. 因为不知道用户多少次能猜对, 我们用: while循环.whileTrue:# 3. 判断本次猜数字是否有问题, 如果有问题, 就提示.try:# 4. 提示用户录入他/她要猜的数字, 并接受.input_numint(input(请输入你要猜的数字: ))# 5. 判断用户输入的数字是否和随机数相等, 并提示.ifinput_numguess_num:print(恭喜你, 猜对了!)breakelifinput_numguess_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:# 可能出错的代码除法运算resulta/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)

更多文章