【自动化测试必学语言】python:文件操作(json文件)
目录
文件介绍
文件操作
文件操作的步骤
1.打开文件
2.读或者写文件
写文件
读文件
3.关闭文件
使用 with open 打开文件
按行读取文件内容
json 文件的处理
json 的介绍
json 文件的语法
json 文件的书写
读取 json 文件
练习
练习2
json 的写入
文件介绍
计算机的文件,就是存储在某种长期储存设备上的一段数据作用: 将数据长期保存下来,在需要的时候使用
- 计算机只认识 二进制(0或1)
- 文件中存储的数据都是以二进制(0或1)的形式去存储的
可以根据文件中的二进制内容,能否使用记事本软件将其转换为文字,将文件分为两种: 文本文件和二进制文件
- 文本文件
- 能够使用记事本软件打开(能够使用记事本转换为文字)
- txt,md,py,html,css,js,json
- 二进制文件
- 不能使用记事本软件打开的
- exe,mp3,mp4,jpg,png
📢 注意:我们操作的基本都是文本文件
文件操作
文件操作的步骤
- 打开文件
- 读或者写文件
- 关闭文件
1.打开文件
打开文件:将文件从磁盘(硬盘)中读取到内存中语法:open ( file , mode = 'r' , encoding = None )> 参数 file : 是要打开的文件,类型是字符串,文件的路径可以是相对路径,也可以是绝对路径(从根目录开始书写的路径),建议使用相对路径(相对于当前代码文件所在的路径, ./../ )> 参数 mode : 默认参数(缺省参数), 表示的是打开文件的方式> r : read 只读打开> w : write 只写打开> a > append 追加打开 , 在文件的末尾写入内容> 参数 encoding : 编码方式 , ( 文 字和二进制如何进行转换的 )> gbk : 将⼀个汉字转换为 2 个字节二进制> utf - 8 : 常用,将⼀个汉字转换为 3 个字节的二进制> 返回值:返回的是文件对象,后续对文件的操作,都需要这个对象
2.读或者写文件
写文件
向文件中写入指定的内容前提: 文 件的打开方式是 w 或者 a
文件对象 . write ( ' 写入文件的内容 ' )
# 返回值: 写入文件的字符数, 一般不关注
# 注意 w 方 式打开文件:
- 文件不存在,会直接创建文件
- 文件存在,会覆盖原文件(将原文件中的内容清空)
# 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 () 打开文件的好处: 不用自己去书写关闭文件的代码,会自动进行关闭
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 open('b.txt', encoding='utf-8') as f:
# buf = f.readline() # 111# print(buf)
# print(f.readline()) # 222# with open('b.txt', encoding='utf-8') as f:
# for i in f: # 按行读取,读到文件末尾结束
# print(i, end='')
# read() 和 readline() 读到文件末尾,返回⼀个空字符串,即长度为 0with open('b.txt', encoding='utf-8') as f:while True:buf = f.readline()if len(buf) == 0:breakelse:print(buf, end='')# 在容器中,容器为空,即容器中的数据的个数为 0,表示False,其余情况都是 True
with open('b.txt', encoding='utf-8') as f:while True:buf = f.readline()if buf: # if len(buf) != 0print(buf)else:break
json 文件的处理
json 文件 也是⼀个文本文件 , 就可以直接使用 read () 和 write () 方法去操作文件 , 只是使用这两个方法 , 不方便 , 所以 对 json 文件有自己独特的读取和写入的方法常用在做测试的时候,将测试数据定义为 json 文件格式,使用代码读取 json 文件,即读取测试数据,进行传参(参数化)
json 的介绍
json 基于文本,独立于语言的轻量级的数据交换格式
- 基于文本,是⼀个文本文件,不能包含图片,音视频等
- 独立于语言,不是某个语言特有的,每种编程语言都可以使用的
- 轻量级,相同的数据,和其他格式相比占用的大小较小
- 数据交换格式,后端程序员 给前端的数据 ( json , html xml)
json 文件的语法
- json 文件的后缀是 .json
- json 中主要数据类型为 对象({} 类似 Python 中 字典) 和 数组([]类似 Python 中的列表),对象和 数组可以互相嵌套
- ⼀个json 文件是⼀个 对象或者数组(即 json 文件的最外层要么是⼀个 {},要么是⼀个 数组 [])
- json 中的对象是由键值对组成的,每个数据之间使用逗号隔开,但是最后⼀个数据后边不要写逗号
- json 中的字符串必须使用双引号
- json 中的其他数据类型
- 数字类型 ----> int float
- 字符串 string ---> str
- 布尔类型 true, false -----> True, False
- 空类型 null ----> None
json 文件的书写
我叫小明 , 我今年 18 岁 , 性别男 , 爱好:听歌 , 游戏 , 购物 , 吃饭 , 睡觉 , 打豆豆 , 我的居住地址为:国家中国 , 城市上海
{"name": "⼩明","age": 18,"isMen": true,"like": ["听歌","游戏","购物","吃饭","睡觉","打⾖⾖"],"address": {"country": "中国","city": "上海"}
}
读取 json 文件
1. 导包 import json2. 读打开文件3. 读文件json . load ( 文 件对象 )# 返回的是 字典(文件中是对象)或者列表(文件中是数组)
# 1. 导⼊ json
import json# 2. 读打开⽂件
with open('info.json', encoding='utf-8') as f:# 3. 读取⽂件# buf = f.read()# print(type(buf), buf)result = json.load(f)print(type(result)) # <class 'dict'># 姓名print(result.get('name'))# 年龄print(result.get('age'))# 城市print(result.get('address').get('city'))
练习
我叫小明 , 我今年 18 岁 , 性别男 , 爱好:听歌 , 游戏 , 购物 , 吃饭 , 睡觉 , 打豆豆 , 我的居住地址为:国家中国 , 城市上海我叫小红 , 我今年 17 岁 , 性别女 , 爱好:听歌 , 学习 , 购物,我的居住地址为:国家中国, 城市北京
- Info2.json
[{"name": "⼩明","age": 18,"isMen": true,"like": ["听歌","游戏","购物","吃饭","睡觉","打⾖⾖"],"address": {"country": "中国","city": "上海"}
},{"name": "⼩红","age": 17,"isMen": false,"like": ["听歌","购物","学习"],"address": {"country": "中国","city": "北京"}}
]
- 代码文件
import json
with open('info2.json', encoding='utf-8') as f:info_list = json.load(f)for info in info_list:print(info.get('name'), info.get('age'),info.get('address').get('city'))
练习2
某网站的测试数据如下 data . json , 需求 , 提取 json 文件中的 用户名 , 密码和预期结果 , 组成如下格式 : [() , () , ()] ( 自 动化参数化需要的数据格式 )
[{"desc": "正确的⽤户名密码","username": "admin","password": "123456","expect": "登录成功"},{"desc": "错误的⽤户名","username": "root","password": "123456","expect": "登录失败"},{"desc": "错误的密码","username": "admin","password": "123123","expect": "登录失败"}
]
import jsondef read_data():new_list = []with open('info3.json', encoding='utf-8') as f:data = json.load(f) # 列表# print(data)for i in data: # i 字典# print((i.get('username'),i.get('password'), i.get('expect')))new_list.append((i.get('username'),i.get('password'), i.get('expect')))# print(new_list)return new_list
json 的写入
文件对象 . write ( 字符串 ) 不能直接将 Python 的列表 和字典 作为参数传递想要将 Python 中的数据类型存为 json 文 件 , 需要使用 json 提供的方法 , 不再使用 write步骤 :1. 导包 import json2. 写 ( w ) 方式打开文件3. 写入 json . dump ( Python 中的数据类型,文件对象 )
import json
my_list = [('admin', '123456', '登录成功'), ('root','123456', '登录失败'), ('admin','123123', '登录失败')]
with open('info4.json', 'w', encoding='utf-8') as f:# json.dump(my_list, f)# json.dump(my_list, f, ensure_ascii=False) #直接显示中⽂,不以 ASCII 的⽅式显示# 显示缩进# json.dump(my_list, f, ensure_ascii=False,indent=2)json.dump(my_list, f, ensure_ascii=False,indent=4)