文件
文件操作, 使用代码 来读写文件
1, Game 案例,最高分不能保存的, 可以将最高分保存到文件中,
2, 自动化, 测试数据在文件中保存的, 从文件中读取测试数据,进行自动化代码的执行
文件的介绍
文件: 可以存储在长期存储设备(硬盘, U盘)上的一段数据即为文件
1, 计算机只认识 二进制数据(0 和 1)
2, 所有的文件在计算机中存储的形式都是 二进制即 0 和 1 ,打开文件看到的是文字不是 0 和 1 ,原因是打开文件的
软件会自动的将二进制转换为 文字
文件的分类(根据能否使用文本软件(记事本)打开文件):
- 文本文件
- 二进制文件
- 文本文件
- 可以使用记事本软件打开
txt, py, md, json
- 二进制文件
- 不能使用 记事本软件打开
- 音频文件
mp3 - 视频文件
mp4 .... - 图片
png, jpg, gif, exe
文件操作的步骤
1. 打开文件
2. 读、写文件
l, 读 将文件内容读入内存
2, 写 将内存内容写入文件
3. 关闭文件
打开文件 open()
open(file, mode='r', encoding=None) # 将硬盘中的文件 加载到内存中
- file: 表示要操作的文件的名字,可以使用相对路径 和绝对路径
- 绝对路径, 从根目录开始书写的路径 C:/ D:/
- 相对路径, 从当前目录开始书写的路径 ./ ../
- mode: 打开文件的方式
- r , 只读打开 read, 如果文件不存在,会报错
- w , 只写打开, write, 如果文件存在, 会覆盖原文件
- a , 追加打开, append, 在文件的末尾写入新的内容
- encoding: 编码格式, 指 二进制数据 和 汉字 转换的规则的
- utf-8(常用) : 将一个汉字转换为 3 个字节的二进制
- gbk: 将一个汉字转换为 2 个字节的二进制
返回值: 文件对象, 后续对文件的操作, 都需要这个文件对象
关闭文件 close()
文件对象.close() # 关闭文件, 如果是 写文件, 会自动保存, 即将内存中的数据同步到硬盘中
读文件 read()
变量 = 文件对象.read()
返回值: 返回读取到文件内容, 类型是字符串
# f=open("a.txt",encoding="utf-8") #不写mode,默认’r'
# buf=f.read()
# print(buf)
with open('a.txt','r',encoding='utf-8') as f:
buf=f.read()
print(buf)
写文件 write()
文件对象.write()
# 参数: 写入文件的内容, 类型 字符串
# 返回值: 写入文件中的字符数, 字符串的长度, 一般不关注
# 打开文件
f = open('a.txt', 'w', encoding='utf-8')
# 写文件
# f.write("好好学习 \n天天向上")
f.write("第二次写入,覆盖第一次内容")
# 关闭文件
f.close()
文件打开的另一种写法(推荐)
with open(file, mode, encoding) as 变量: # 变量 就是文件对象
pass
# 使用这种写法打开文件, 会自动进行关闭,不用手动书写关闭的代码
# 出了 with 的缩进之后, 文件就会自动关闭
with open('a.txt', 'a', encoding='utf-8') as f: #a:从a.txt的末尾 追加 内容
f.write('good good study\n')
按⾏读取⽂件 readline()
⽂件对象.readline() # ⼀次读取⼀⾏的内容, 返回读取到的内容
read() 和 readline() 如果读到⽂件末尾, 返回的都是 空字符串
with open('a.txt', encoding='utf-8') as f:
buf = f.readline()
print(buf) # aaaaaa
buf1 = f.readline()
print(buf1) # bbbbbb
读取⼤⽂件
# with open('a.txt', encoding='utf-8') as f:
# while True:
# buf = f.readline() # ⽂件读完了,返回 空字符串
# if buf == "":
# break
# else:
# print(buf, end='')
with open('a.txt', encoding='utf-8') as f:
while True:
buf = f.readline() # ⽂件读完了,返回 空字符串
if buf: # 空字符串 是 False, ⾮空字符串 是True
print(buf, end='')
else:
break
打开⽂件的⽅式
r w a 称为是⽂本⽅式打开, 适⽤于 ⽂本⽂件, 会对⼆进制进⾏编码转换
rb wb ab 称为是⼆进制⽅式打开, 可以打开⽂本⽂件和⼆进制⽂件, 但是 ⼆进制⽂件只能使⽤ ⼆进制⽅式打开,
同时,不能传递 encoding 参数
DAY-08课堂笔记
json ⽂件
1, json ⽂件的本质也是⽂本⽂件, 就可以直接使⽤ read 和
write 去进⾏操作
2, json ⽂件⽐较特殊, ⽐较像 Python 中的字典和列表
3, json ⽂件使⽤⽐较频繁,按照 read 和 write 的操作,⽐较麻烦,
专⻔的⽅法来操作 json ⽂件, 可以直接得到 Python 中的列表和字典
介绍:
1, json ⽂件, 是⼀种基于⽂本,独⽴于语⾔的轻量级数据交换格式。
- 基于⽂本, ⽂本⽂件,不包含 图⽚,视频等
- 独⽴于语⾔, 不是某⼀种语⾔特有的, Python,Java, C++,
....
- 轻量级, 相同的数据量,json ⽂件的占⽤的⽂件⼤⼩相对较⼩
- 数据交换格式, 后端服务器 和前端⻚⾯ 交换数据使⽤的格式
2, 在⾃动化测试中经常⽤来存放测试数据,⽂件后缀名为:.json
json 操作
json ⽂件的定义
我叫⼩明,我今年 18 岁,性别男, 学校 空, 爱好 听歌,吃饭,打⾖⾖, 我的居住地址为 国家 中国, 城市 ⼴州.
{
"name":"小明",
"age": 18,
"isMan": true,
"school": null,
"like":["听歌","吃饭","打豆豆"],
"address": {
"country": "China",
"city": "广州"
}
}
读取 json ⽂件
1, 可以直接使⽤ read 去读, 但是 想要取到数据很麻烦
2, 使⽤ 专⻔的⽅法去读
- 1. 导包 import json
- 2. json.load(⽂件对象) ---> 得到的是 列表 或者字典
import json
with open("info", encoding="utf-8") as f:
buf = json.load(f)
print(buf) # {'name': '小明', 'age': 18, 'isMan': True, 'school': None, 'like': ['听歌', '吃饭', '打豆豆'], 'address': {'country': 'China', 'city': '广州'}}
print(buf.get('name')) # 小明
print(buf.get('like')) # ['听歌', '吃饭', '打豆豆']
print(buf.get('address').get("city")) # 广州
print(buf.get('like')[2]) # 打豆豆
练习
我叫⼩明,我今年 18 岁,性别男, 爱好 听歌, 吃饭,打⾖⾖,
我的居住地址为 国家中国, 城市⼴州. ---> 对象
我叫⼩红,我今年 17 岁,性别⼥, 爱好 听歌, 学习,购物
我的居住地址为 国家 中国, 城市北京. ---> 对象
-----
获取 每个⼈的姓名, 年龄 性别, 城市
json文件:
[
{
"name": "小明",
"age": 18,
"isMan": true,
"like": [
"听歌",
"吃饭",
"打豆豆"
],
"address": {
"country": "China",
"city": "广州"
}
},
{
"name": "小红",
"age": 17,
"isMan": false,
"like": [
"听歌",
"学习",
"购物"
],
"address": {
"country": "China",
"city": "北京"
}
}
]
import json
with open("info2.json", encoding="utf-8") as f:
buf = json.load(f) # 列表
for i in buf:
if i.get("isMan"):
sex="男"
else:
sex="女"
print(f"name:{i.get('name')},age:{i.get('age')},sex:{sex},city:{i.get('address').get('city')}")
写⼊(了解)
将 Python 中列表或者字典 转换为 json ⽂件
导包 import json
使⽤ json.dump(Python中数据, ⽂件对象)
import json
info = {'name': '⼩明', 'age': 18}
with open('info3.json', 'w', encoding='utf-8') as f:
# json.dump(info, f)
# json.dump(info, f, ensure_ascii=False) # 直接显示中⽂
json.dump(info, f, ensure_ascii=False, indent=2) # 直接显示中⽂,并且缩进

dump参数:
ensure_ascii参数用于控制非ASCII字符的处理方式;<1>indent参数用于定义生成的JSON字符串或文件的缩进级别,使得输出更易于阅读;<2>separators参数允许指定分隔符;sort_keys参数可以指定是否对字典的键进行排序;default和cls参数提供了自定义序列化的方式
异常
介绍
1, 程序在运⾏时, 如果Python解释器遇到到⼀个错误, 则会停⽌程序的执⾏, 并且提示⼀些错误信息, 这就是异常.
2, 程序停⽌执⾏并且提示错误信息这个动作, 通常称之为: 抛出(raise) 异常
异常类型: 错误描述信息
FileNotFoundError: [Errno 2] No such file ordirectory: 'aaaa.txt'
ZeroDivisionError: division by zero
ValueError: invalid literal for int() with base 10:'78.1'
捕获异常
1, 程序代码在执⾏的时候, 如果遇到异常, 程序就会终⽌,不会继续执⾏
2, 需求: 程序遇到异常之后, 不会结束,可以继续执⾏,
3, 实现需求: 就需要使⽤ 异常捕获
try:
可能发⽣异常的代码
except: # 可以捕获任意类型的异常
发⽣了异常执⾏的代码
# 1. 获取⽤户从键盘输⼊的数据
num = input('请输⼊数字:')
try:
# 2. 转换数据类型为整数
num = int(num)
# 3. 数据转换类型正确时, 输出数据内容
print(num)
except:
# 4. 数据转换类型错误时, 提示输⼊正确数据
print('请输⼊正确的数字')
捕获指定类型的异常
发⽣的异常可能存在多种, 针对不同类型的异常, 解决处理的⽅案不⼀样
try:
可能发⽣异常的代码
except 异常类型1:
发了异常类型1,执⾏的代码
except 异常类型2:
发了异常类型2,执⾏的代码
except .....:
pass
try:
num = int(input('请输⼊⼀个整数数字:'))
num1 = 8 / num
print(num1)
except ValueError: #
print('输⼊的内容⾮数字,请重新输⼊')
except ZeroDivisionError:
print('不能输出数字 0, 请重新输⼊')
捕获未知类型的异常(使⽤最多)
try:
可能发⽣异常的代码
except Exception as 变量: # Exception 常⻅异常类的⽗类, 变量 异常对象,print()可以打印异常信息
发⽣异常执⾏的代码
try:
num = int(input('请输⼊⼀个整数数字:'))
num1 = 8 / num
print(num1)
except Exception as e:
print(f'发⽣了异常, {e}')
异常捕获的完整结构
try:
可能发⽣异常的代码
except 异常类型:
发⽣了指定类型的异常执⾏的代码
except Exception as e:
发⽣了其他类型的异常执⾏的代码
else:
没有发⽣异常, 会执⾏的代码
finally:
不管有没有发⽣异常, 都会执⾏的代码
案例
需求:
1. 获取用户输入的数字
2. 判断获取的数字是否整数
3. 如果不是整数, 提示输入错误
4. 如果是整数, 则进一步判断是奇数还是偶数
5. 最终提示: 程序运行结束
# ⽅案⼀
使⽤异常捕获
# ⽅案⼆
if 判断
字符串.isdigit() 判断数字是否是纯数字,是 纯数字,返回
True,不是返回 False
# 1. 获取⽤户输⼊的数字
num = input('请输⼊数字:')
try:
# 2. 判断获取的数字是否整数
num = int(num) # 没有发⽣异常, 说明是整数,如果发⽣异常,说明不是整数
except Exception as e:
# 3. 如果不是整数, 提示输⼊错误
print("输⼊错误", e)
else:
# 4. 如果是整数, 则进⼀步判断是奇数还是偶数
if num % 2 == 0:
print('偶数')
else:
print('奇数')
# 5. 最终提示: 程序运⾏结束
finally:
print('程序运⾏结束')
# 1. 获取⽤户输⼊的数字
num = input('请输⼊数字:')
# 2. 判断获取的数字是否整数
if num.isdigit():
# 如果是 True, 表示是整数
# 类型转换
num = int(num)
# 4. 如果是整数, 则进⼀步判断是奇数还是偶数
if num % 2 == 0:
print('偶数')
else:
print('奇数')
# 3. 如果不是整数, 提示输⼊错误
else:
print('输⼊错误')
# 5. 最终提示: 程序运⾏结束
print('程序运⾏结束')
.isdigit():判断数字是否是纯数字,是 纯数字,返回
"10".isdigit()
-True
"11.5".isdigit()
-False
"aaa".isdigit()
-False
异常传递
1, 异常传递 是 Python 中已经实现好的功能, 不需要我们写代码实现
2, 异常传递是指, 在函数的嵌套调⽤过程中,如果发⽣了异常,没有进⾏捕获,会将这个异常传递到函数调⽤的地⽅, 直到被捕获为⽌, 如果⼀直没有捕获,才会报错,终⽌执⾏
抛出异常
1, 在执⾏代码的过程中,之所以会发⽣异常,终⽌代码执⾏,是因为 代码执⾏ 遇到了 raise 关键字
2, raise 关键字的作⽤, 就是来抛出异常,让代码终⽌执⾏
3, 应⽤场景: ⾃⼰书写代码模块,让别⼈使⽤,为了让别⼈按照你的规定使⽤你的代码,你就可以在他不满⾜你条件的情况下,使⽤raise 抛出异常
浙公网安备 33010602011771号