今日内容
- 文件操作
– 普通文件的操作
– json文件的操作【重点】 - 异常处理(程序代码运行时的报错处理)
文件介绍
计算机的文件,就是存储在某种 长期存储设备 上的一段数据。
作用:
将数据长期报错下来,在需要的时候使用
- 计算机只认识 二进制 0 1
- 文件中存储的数据都是以二进制 0 1 的形势去存储的
我们可以通过记事本打开文件,看看它是否能显示为文字,来判断这个文件是文本文件还是二进制文件。如果能正常显示文字,就是文本文件;如果显示乱码,就是二进制文件。
- 文本文件
1. 能够使用记事本打开,并可以正确地将这些内容显示为文字。
2. 常见文本文件:txt、md、py、html、css、js、json - 二进制文件
1. 不能使用记事本打开的文件,记事本打开后会显示一堆乱码,无法直接看懂。
2. 常见二进制文件:exe、mp3、mp4、png
我们操作的基本都是文本文件
文件操作
1.文件操作的步骤
- 打开文件
- 读 或者 写 文件
- 关闭文件
打开文件
将文件从磁盘(电脑硬盘)中,读取到内存中。
语法:
open(file,mode=’r’,encoding=None)
> 参数 file:表示需要代开的文件,类型为字符串,打开文件的路径可以是相对路径,也可以是绝对路径(从根目录开始书写的路径),使用该参数时,建议使用相对路径(就是相对于代码文件所在的路径,例如:./ ../)
> 参数 mode:表示默认参数(也就是所谓的缺省参数),它表示的是打开文件的方式。
> r:read 为只读打开
> w:wirte 为只写打开
> a:append 表示追加打开,在文件的末尾写入内容
> 参数 encoding:为编码方式(也就是二进制如何转换的)
> gbk:表示将一个汉字转换为 2 个字节的二进制
> utf-8:为常用参数,表示将一个汉字转换为 3 个字节的二进制
> 返回值:返回的是 文件对象,后续对文件的操作,都需要这个对象
2.读或者写文件
- 写文件
向文件中写入指定的内容。
使用的前提:文件的打开方式需要是w或者a - 语法
文件对象.write(’写入文件的内容’)
# 返回值为写入文件的字符数,我们一般不做关注
# 注意使用 w 方式 打开文件
1. 如果文件不存在,该语法会直接创建文件
2. 如果文件存在,运行该语法会覆盖原文件(将原文件中的内容清空) - 代码
# 1. 打开文件
f = open('a.txt','w',encoding='utf-8')
# 2.写文件
f.write('好好学习\n')
f.write('天天向上')
# 3.关闭文件
f.close()
- 读文件
将文件中的内容读取出来。
使用的前提:文件的打开方式需要时 r - 语法
文件对象.read(n)
# 这里的参数 n 表示读取多少个字符,我们一般不写,表示读取全部内容
# 该语法的返回值为读取到的文件内容,类型是 字符串 - 代码
# 1. 打开文件
f.open('a.txt','r',encoding='utf-8')
# 2. 读文件
buf = f.read()
print(buf) # 打印读取到的文件
# 3.关闭文件
f.close()
# 使用 r 方式打开文件,如果文件不存在,代码会报错
3.关闭文件
关闭文件就是将文件占用的资源进行清理,同时会保存文件,文件关闭之后,这个文件对象就不能使用了。
- 语法
文件对象.close()
使用 with open 打开文件
with open(file,mode,encoding=’utf-8′) as 变量:
# 在缩进中去读取或者写入文件
# 缩进中的代码执行结束,出缩进之后,文件会自动关闭
- 代码
with open('a.txt','a',encoding='utf-8') as f:
f.write('good good study')
# a 的作用是打开文件的方式,文件不存在会创建文件,文件存在,则在文件的末尾写入内容
按行读取文件内容
按行读取文件内容,就是一次读取一行内容
- 语法
文件对象.readline() - 代码
# # 使用with语句打开文件,确保文件在操作完成后自动关闭
# with open('b.txt', encoding='utf-8') as f:
# # 读取文件的第一行内容,并将其存储在变量but中
# but = f.readline() # 111
# # 打印第一行内容
# print(but)
# # 读取并打印文件的第二行内容
# print(f.readline()) # 222
# # 使用with语句打开文件,确保文件在操作完成后自动关闭
with open('b.txt', encoding='utf-8') as f:
# 按行读取文件内容,直到文件末尾
for i in f:
# 打印当前行内容,end=''参数表示不换行
print(i, end='')
# read() 和 readline() 读到文件末尾,返回一个空字符串,长度为 0
# 使用with语句打开文件,确保文件在操作完成后自动关闭
with open('b.txt', encoding='utf-8') as f:
# 循环读取文件的每一行
while True:
# 读取文件的一行内容,存储在变量buf中
buf = f.readline()
# 如果读取到的行内容为空(即长度为0),则跳出循环
if len(buf) == 0:
break
else:
buf = buf.strip() # 强制去除末尾的换行符
# 打印当前行内容,end=''参数表示不换行
print(buf, end='')
# 在容器中,容器为空,即容器中的数据的个数为 0,表示false, 其余情况都是true
# 打开文件 'b.txt',并指定编码为 'utf-8'
with open('b.txt', encoding='utf-8') as f:
# 开始一个无限循环
while True:
# 从文件中读取一行内容到变量 buf
buf = f.readline()
# 如果 buf 不为空(即 len(buf) != 0),表示还有内容未读取
if buf:
# 打印当前读取的行内容
print(buf)
else:
# 如果 buf 为空,表示文件已经读取完毕
break
json文件的处理
json文件,也是一个文本文件,它可以直接使用 read() 和 write() 方法 去操作文件。
只是使用这两个方法,不方便,所以对于 json 文件有自己独特的读取和写入的方法
该方法常用在做测试的时候,将测试数据定义为json文件的格式,使用 代码读取 json 文件,即读取测试数据,进行传参(也就是参数化)
1.json的介绍
json 是一个基于文本,独立于语言的轻量级的数据交换格式
- 基于文本:就是他是一个文本文件,但是不能包含图片,音视频等
- 独立语言:就是不是某个语言特有的,每种编程语言都可以使用它
- 轻量级:就是相同的数据,和其他格式相比,占用的大小比较小
- 数据交换格式:作为后端程序员,给前端的数据(常见的有json、html、xml)
2.json文件的语法
- json文件的后缀是 .json
- json中的主要数据类型为 对象({}类似于python中的字典)和数组([]类似于python中的列表),json中的对象和数组可以互相嵌套。
- 一个json 文件是一个对象或者数组(即 json 文件的最外层要么是一个{},要么是一个[])。
- json中的对象是由键值对组成的,每个数据之间使用逗号隔开,但是最后一个数据后边不要写英文逗号
- json中的字符串 必须使用英文双引号包起来
- json中的其他数据类型
> 数字类型int float——>int
> 字符串 string——>str
> 布尔类型 true、false——> True、False
> 空类型 null ——> None
3.json 文件的书写
- 例如
我叫小明,我今年18岁,性别男,爱好:听歌、游戏、购物、吃饭、睡觉、打豆豆
我的居住地址为 国家:中国,城市:上海 - 代码案例
{
"name" : "小明",
"age" : 18,
"isMen" : true,
"like" : [
"听歌",
"游戏",
"购物",
"吃饭",
"睡觉",
"打豆豆"
],
"address" : {
"countre" : "中国",
"city" : "上海"
}
}
4.读取json文件
- 导报 import json
- 读-打开文件
- 读文件
json.load(文件对象)
注意:
该代码返回的是 字典(文件中是对象)或者列表(文件中是数组)
- 代码案例
# 1.导入json模块
import json
# 导入Python的json模块,这个模块提供了处理JSON数据的函数,包括将JSON数据转换为Python对象和将Python对象转换为JSON数据。
# 2.打开json文件
with open('1.json', encoding='utf-8') as f:
# 使用with语句打开文件,确保文件在使用完毕后自动关闭,避免资源泄露。
# '1.json'是文件名,'utf-8'是文件的编码格式,确保能够正确处理包含非ASCII字符的数据。
# 3.读取json文件
result = json.load(f)
# 使用json.load()函数从打开的文件对象f中读取JSON数据,并将其解析为Python字典。
# result变量现在包含了解析后的JSON数据,可以像操作普通Python字典一样操作它。
print(type(result))
# 打印result变量的类型,由于result是一个字典,所以输出将是<class 'dict'>。
print(result.get('name'))
# 使用字典的get方法尝试获取键为'name'的值,如果键不存在,则返回None。
print(result.get('age'))
# 使用字典的get方法尝试获取键为'age'的值,如果键不存在,则返回None。
print(result.get('address').get('city'))
# 首先尝试获取键为'address'的值,如果键不存在,则返回None。
# 然后尝试从返回的对象中获取键为'city'的值,如果键不存在,则返回None。
5.练习
- info2.json
[
{
“name”: “小明”,
“age”: 18,
“isMen”: true,
“like”: [
“听歌”,
“游戏”,
“购物”,
“吃饭”,
“睡觉”,
“打豆豆”
],
“address”: {
“country”: “中国”,
“city”: “上海”
}
},
{
“name”: “小红”,
“age”: 17,
“isMen”: false,
“like”: [
“听歌”,
“购物”,
“学习”
],
“address”: {
“country”: “中国”,
“city”: “北京”
}
}
]
- 代码文件
# 导入json模块,用于处理JSON数据
import json
# 使用with语句打开名为'info2.json'的文件,并指定编码为utf-8
# 'with'语句确保文件在使用后自动关闭,即使在处理过程中发生异常
with open('info2.json', encoding='utf-8') as f:
# 使用json.load()方法将文件中的JSON数据解析为Python对象(通常是列表或字典)
# 这里假设'info2.json'文件包含一个JSON数组,解析后存储在info_list变量中
info_list = json.load(f)
# 遍历info_list中的每个元素,info代表列表中的每个字典
for info in info_list:
# 使用info.get('name')获取当前字典中'name'键对应的值
# get()方法在键不存在时返回None,避免引发KeyError异常
name = info.get('name')
# 使用info.get('age')获取当前字典中'age'键对应的值
age = info.get('age')
# 使用info.get('address')获取当前字典中'address'键对应的值(假设是一个字典)
# 然后使用.get('city')获取'address'字典中'city'键对应的值
city = info.get('address').get('city')
# 打印当前字典中的'name'、'age'和'address'中的'city'值
print(name, age, city)
练习2
某网站的测试数据如下 data.json, 需求,提取 json 文件中的 用户名,密码和预期结果, 组成如下格式: [(), (), ()] (自动化参数化需要的数据格式)
[
{
“desc”: “正确的用户名密码”,
“username”: “admin”,
“password”: “123456”,
“expect”: “登录成功”
},
{
“desc”: “错误的用户名”,
“username”: “root”,
“password”: “123456”,
“expect”: “登录失败”
},
{
“desc”: “错误的密码”,
“username”: “admin”,
“password”: “123123”,
“expect”: “登录失败”
}
]
- 代码练习
# 导入json模块,用于处理JSON数据
import json
# 定义一个函数read_data,用于从JSON文件中读取数据并返回处理后的列表
def read_data():
# 创建一个空列表new_list,用于存储处理后的数据
new_list = []
# 使用with语句打开名为'info3.json'的文件,并指定编码为utf-8
# 'with'语句确保文件在使用后自动关闭,即使在处理过程中发生异常
with open('info3.json', encoding='utf-8') as f:
# 使用json.load()方法将文件中的JSON数据解析为Python对象(通常是列表或字典)
# 这里假设'info3.json'文件包含一个JSON数组,解析后存储在data变量中
data = json.load(f)
# 遍历data中的每个元素,i代表列表中的每个字典
for i in data:
# 使用i.get('username')获取当前字典中'username'键对应的值
username = i.get('username')
# 使用i.get('password')获取当前字典中'password'键对应的值
password = i.get('password')
# 使用i.get('expect')获取当前字典中'expect'键对应的值
expect = i.get('expect')
# 将username、password和expect组成一个元组,并使用append()方法将其添加到new_list中
new_list.append((username, password, expect))
# 返回处理后的new_list
return new_list
json的写入
文件对象.write(字符串) 是不能直接将python 的列表和字典作为 参数传递的。
如果想要将python 中的数据类型存为 json 文件,需要使用 json 提供的方法,所以我们在写入json文件时不再使用write。
- 步骤
1. 导报 import json
2. 使用 (w)方式打开文件
3. 写入内容,使用json.dump(python中的数据类型,也就是文件对象)
代码案例:
# 导入json模块,用于处理JSON数据
import json
# 定义一个包含元组的列表my_list,每个元组包含用户名、密码和登录结果
my_list = [('admin', '123456', '登录成功'), ('root', '123456', '登录失败'), ('admin', '123123', '登录失败')]
# 使用with语句打开名为'info4.json'的文件,模式为写入模式('w'),并指定编码为utf-8
# 'with'语句确保文件在使用后自动关闭,即使在处理过程中发生异常
with open('info4.json', 'w', encoding='utf-8') as f:
# 将my_list列表写入JSON文件中
# 以下是几种不同的json.dump()方法的使用方式:
# 1. 最基本的写入方式
# json.dump(my_list, f)
# 这种方法会将my_list直接写入文件,但中文字符会以ASCII编码显示(如\u767b\u5f55\u6210\u529f)
# 2. 确保中文字符直接显示,而不是以ASCII编码显示
# json.dump(my_list, f, ensure_ascii=False)
# 这种方法会将中文字符直接写入文件(如"登录成功"),而不是以ASCII编码显示
# 3. 添加缩进,使JSON文件更具可读性
# json.dump(my_list, f, ensure_ascii=False, indent=2)
# 这种方法会将JSON数据格式化,每层缩进2个空格
# 4. 添加缩进,每层缩进4个空格
json.dump(my_list, f, ensure_ascii=False, indent=4)
# 这种方法会将JSON数据格式化,每层缩进4个空格,使文件更易于阅读