文件操作
一、文件引入
1、自动化测试时,测试数据保存到文件中。从文件中读取测试数据,进行自动化代码的执行
二、文件操作
文件:可以存储在长期存储设备上的一段数据即为文件。(计算机只认识二进制 0 和 1 )
文件类型(根据能否使用文本软件(记事本)打开文件):
文本文件:可以使用记事本打开(如:txt、py、md、JSON)
二进制文件:(不可以使用记事本打开(如:mp3、mp4、jpg、png。。。))
三、文件操作步骤(打开和关闭文件)
1、打开文件(返回值:文件对象,后续对文件的操作,都需要这个文件对象。将硬盘中的文件,加载到内存中)
open(file, mode='r', encoding=None) #file 表示操作文件的名字,可以使用相对路径 和 绝对路径 #绝对路径:从根目录开始书写的路径:c:/ D:/ #相对路径:从当前目录开始的路径:./ ../ #mode 表示打开文件的方式(文本方式打开(r / w /a ),适用于文本文件,会对二进制进行转码) # r :表示只读打开,如果文件不存在会报错 # w:只写打开,如果文件存在,会覆盖源文件 # a:追加打开,在文件末尾写入新的内容 # rb/wb/ab(二进制方式打开,可以打开文本文件和二进制文件。但二进制文件只能使用此方法,且此时不需要写入encoding)
#encoding 表示编码格式,指二进制 和 汉字 转换的规则 # utf-8:将一个汉字转换为三个字节的二进制 # jbk:将一个汉字转换为两个字节二进制
2、关闭文件
文件对象 . close() #关闭文件,如果是写文件,会自动保存,即将内存的数据存到硬盘中。
3、读文件
变量 = 文件对象 . read() #返回值:返回读取到文件内容,类型为字符串
4、写文件
文件对象 . write() #返回值:写入文件中的字符数,字符串长度。写入文件中的内容为二进制,字符串
写文件例子:
#1、打开文件 f = open("a.txt",mode = "w",encoding = "utf-8") #写入文件 f.write("hello") #关闭文件 f.close()
读文件例子:
#1、打开文件 with open("a.txt",mode = "r",encoding = "utf-8") as f: #使用此种方法,会自动关闭,不用手动关闭书写 #读文件 print(f.read()) #方式二 f = open("a.txt",mode = "r",encoding = "utf-8") #读文件 r = f.read() #关闭文件 f.close()
四、按行读取文件
1、文件对象 . readline() #一次读取一行内容,返回读取到的内容
read() 和 readline() #如果读到文件末尾,返回都是 空字符串
with open("a.txt",encoding="utf-8") as f:
#一行一行读 # buf = f.readline() #aaaaaaaaa 一次读取一行 # print(buf) # buf1 = f.readline() #bbbbbbbbb 接着上面的一行读 # print(buf1)
#读取大文件 while True: buf2 = f.readline() if buf2 == "": break else: print(buf2,end="")
五、JSON文件(本质也是文本文件,可以使用 read 和 write 去进行操作)
1、JSON文件比较特殊,比较像Python文件中的字典和列表
2、定义:JSON是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式
数据交换格式:后端服务器 和 前端页面 交换数据使用的格式
3、JSON数据必须为字符串类型,必须使用英文的双引号
JSON数据类型:
对象 {}:
数组 []:
字符串:必须使用双引号
数字类型:int float
布尔值:true / false 小写
空值:null
4、JSON文件,是一个对象 或者 是一个数组。二者可以相互嵌套(由键值对组成,键必须为字符串类型,数据直接用逗号隔开,最后一个数据后边不能加逗号)
5、JSON文件定义
6、读取JSON文件
可以使用 read ,但是取数据很麻烦。一般使用专门的方法(如下:json.load() )
import json with open("info.json",encoding="utf-8") as f: buf = json.load(f) #此时获取得到的是 列表 或者是 字典 #直接使用列表或者字典的方法获取数据 print(buf.get("name")) #小明 print(buf.get("adress").get("city")) #广州
print(buf.get("name")[1])
当有两个对象时(以列表套字典格式)
[ { "name": "小明", "age": 18, "isMan": true, "like": [ "听歌", "吃饭", "打豆豆" ], "adress": { "country": "中国", "city": "广州" } }, { "name": "小明", "age": 18, "isMan": true, "like": [ "听歌", "吃饭", "打豆豆" ], "adress": { "country": "中国", "city": "北京" } } ]
import json with open("info1.json",encoding="utf-8") as f: buf = json.load(f) #此时获取得到的是 列表 或者是 字典(这里需要和原数据对照看确定类型,列表是没有get方法的) #直接使用列表或者字典的方法获取数据 for data in buf: # "男" if data.get("isMan") else "女" 此代码和下面if else执行效果一样 if data.get("isMan"): sex = "男" else: sex = "女" print(data.get("name")) #小明、小红 print({sex},data.get("adress").get("city")) #广州、北京
7、JSON文件写入(了解)
将Python中的列表或者字典,转化为JSON文件(json . dump())
import json info = {"name":"小刚","age":18} with open("info2.json","w",encoding="utf-8") as f: json.dump(info,f,ensure_ascii=False,indent=2) #ensure_ascii=False代表正常中文存储,indent代表缩进,数字代表几个空格