1. 文件
文件的介绍
文件操作: 使用代码来读写文件
-
一般在python里面跑出来的数据, 是不能保存的, 想要进行永久保存, 此时就需要使用到文件
-
在自动化测试里面, 测试数是在文件中保存的, 从文件中读取测试数据, 进行自动化代码的执行
文件: 可以存储在长期存储设备(硬盘, U盘) 上的一段数据为文件
-
计算机只认识 二进制数据(0和1)
-
所有的文件在计算机中的存储形式都是二进制, 打开文件看见的文字不是二进制, 因为打开文件的软件会自动把二进制转化为文字
二进制的分类(是否能够使用文本软件(记事本)打开文件): 文本文件, 二进制文件
文本文件
-
可以使用记事本软件打开
-
类型: txt.py.dm,json..
二进制文件
-
不能使用记事本软件打开
-
类型: 音频文件(mp3), 视频文件(mp4),图片(png,jpg,gif,exe)
文件的操作步骤
步骤
打开文件
读写文件
关闭文件
1> 打开文件 open()
open(file,mode='r',encoding=None) # 把硬盘中的文件加载到内存中
file: 表示要操作的文件的名字, 可以使用相对路径和绝对路径
绝对路径: 从根目录开始书写的路径 C:/ D:/
相对路径: 从当前路径开始书写的路径 ./ ../
mode: 打开文件的方式
- r: 只读打开 read, 如果文件不存在, 就会报错
- w: 只写打开 write, 如果文件存在, 会覆盖原文件
- a: 追加打开 append, 在文件的末尾写入新的内容
-encoding: 编码格式, 指 二进制数据 和 汉字 转换的规则
- utf-8: 把一个汉字转换为 3 个字节的二进制
- gbk: 把一个汉字转换为 2 个字节的二进制
返回值: 文件对象. 后续对文件的操作, 都需要这个文件对象
2> 关闭文件 close()
文件对象.close() # 关闭文件, 如果是写文件, 会自动保存, 即将内存中的数据同步到硬盘中
3> 读文件 read()
变量 = 文件对象.read()
返回值: 返回读取到文件内容, 类型是字符串
代码:
python
f = open('a.txt', mode='r', encoding='utf-8')
print(f.read())
f.close()
4> 写文件 write()
文件对象.write('写入文件的内容')
参数: 写入文件的内容, 类型 字符串
返回值: 写入文件中字符数, 字符串的长度, 一般不关注
代码:
python
# 1, 打开文件
f = open('a.txt', 'w', encoding='utf-8')
# 2, 写文件
# f.write('hello python!')
f.write('好好学习\n天天向上')
# 3, 关闭文件
f.close()
文件打开的另一种写法(推荐)
with open(file,mode,encoding) as 变量: # 变量就是文件对象
pass
使用这种写法打开文件, 会自动进行关闭, 不用手动书写关闭的代码
除了 with 的缩进之后, 文件会自动 close()
代码
python
with open('a.txt', 'w', encoding='utf-8') as f:
f.write("去武汉喽")
2. 文件操作
按行读取文件 readline()
文件对象.readline() # 一次读取一行的内容, 返回读取到的内容
read() 和 readline() # 如果读到文件末尾, 返回的 都是空字符串
代码
python
with open('a.txt', encoding='utf-8') as f:
buf = f.readline()
print(buf) # aaaaaa
buf1 = f.readline()
print(buf1) # bbbbbb
读取大文件(一行一行读取所有的文件内容)
使用readline() 把文件一行一行遍历读出来
代码
python
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() # 文件读完, 返回的是空字符串, 空字符串是 False. 非空是 True
if buf:
print(buf, end='')
else:
break
打开文件的方式
r w a 称为是文本方式打开, 适用于 文本文件, 会对二进制进行编码转换
rb wb ab 称为是二进制方式打开, 可以打开文本文件和二进制文件, 但是 二进制文件只能使用二进制方式打开, 同时, 不能传递 encoding 参数
3. json文件
json 文件的概念以及介绍
概念
-
json 文件也是文本文件, 可以使用 read 和 write 去进行操作
-
json 的格式类似于 Python 中的字典和列表
-
json 使用 read 和 write 会比较麻烦, 一般有专门的方法来操作 json 文件, 可以得到 Python 中的列表和数组
介绍
- json 文件, 是一种基于文本, 独立于语言的轻量级数据交换格式(yaml更加轻量级)
基于文本, 不包含图片视频...
轻量级,相同的数据量, json 占用的文件大小比较小
数据交换格式: 是 前端页面 和 后端服务器 交换数据使用的格式
- 在自动化测试中经常用来存放测试数据, 文件后缀名为: .json
json 的语法
- json 中的数据类型对应Python 中的数据类型
对象 {} ---> Python 字典 dict{}
数组 [] ----> Python 列表 list[]
字符串 必须使用双引号 ----> str
数字类型 ----> int , float
bool 类型(true, false) ---> True False
空值 null ----> None
-
json 文件, 是一个对象或者数组, 对象和数组可以相互嵌套
-
json 中的对象, 是由键值对组成的, 键必须是字符串类型
-
json 中的数据直接使用逗号隔开, 最后一个数据后边不能加逗号
-
json 文件的后缀是 .json
json 文件的定义
例子:
我叫⼩明,我今年 18 岁,性别男, 学校 空, 爱好 听歌,吃饭,打⾖⾖, 我的居住地址为 国家 中国, 城市 ⼴州.
写出来的josn文件
{
"name": "小明",
"age": 18,
"sex": "男",
"school": null,
"hobby": ["听歌","吃饭","打豆豆"],
"address": {
"country": "china",
"city": "广州"
}
}
读取json 文件
-
可以直接使用 read 去读, 但是想要取到数据很麻烦, 我们要转换为 python的字典和列表的形式
-
使用 专门的方法去读
1> 导包 import json
2> json.load(文件对象) --> 这样得到的是列表/字典
代码
python
with open('t1.json', mode='r', encoding='utf-8') as f:
# print(type(f.read()))
buf = json.load(f)
print(type(buf))
# 姓名
print(buf.get('name'))
# 爱好
print(buf.get('hobby')[0])
# 城市
print(buf.get('address').get('city'))
练习
我叫⼩明,我今年 18 岁,性别男, 爱好 听歌, 吃饭,打⾖⾖,我的居住地址为 国家中国, 城市⼴州. ---> 对象
我叫⼩红,我今年 17 岁,性别⼥, 爱好 听歌, 学习,购物我的居住地址为 国家 中国, 城市北京. ---> 对象
获取 每个⼈的姓名, 年龄 性别, 城市
{ "name": "小明", "age": 18, "sex": "男", "school": null, "hobby": \["听歌","吃饭","打豆豆"\], "address": { "country": "china", "city": "广州" } }, { "name": "小红", "age": 17, "sex": "女", "school": null, "hobby": \["听歌","学习","打豆豆"\], "address": { "country": "china", "city": "北京" } }
代码
python
with open('t1.json', mode='r', encoding='utf-8') as f:
# print(type(f.read()))
buf = json.load(f)
print(type(buf))
for i in buf:
print(f"姓名:{i.get('name')},年龄:{i.get('age')},爱好:{i.get('hobby')[0]},城市:{i.get('address').get('city')}")
往json文件写入对象
-
将 Python 中的列表或者字典转化为 json 文件
-
导包使用 import json
-
使用 json.dump(Python中数据, 文件对象)
代码
ensure_ascii=False 确保编码, 显示成中文
indent = 2 显示的格式缩进
python
info = [{'name': '⼩明', 'age': 18}, {"name": "小黑", "age": 78}]
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)
# 直接显示中⽂