软件测试笔记_07Python-文件与异常|模块与包

一、文件操作

1. 打开文件

  • 基本语法:文件对象 = open(file, mode='r', encoding=None)
  • 参数说明
  1. file 要打开的文件,字符串类型,一般写相对路径
  2. mode 默认参数(缺省参数),表示打开文件的方式
    r : read 只读打开
    w : write 只写打开
    a > append 追加打开,末尾写入
    参数 encoding 编码方式(文字&二进制之间的转换)
    gbk 汉字转换为2个字节二进制
    utf-8 汉字转为3个字节的二进制
  3. 返回值
    返回的是文件对象

2. 读或者写文件

  • 写文件
  1. 前提:文件的打开方式限制是 w 或 a
  2. 用法:文件对象.write('写入的内容')
  3. 返回值:写入的内容的字符数(一般不关注)
  4. 文件存在会进行覆盖,文件不存在会直接创建
# 打开文件
file = open('test1.txt', 'w',encoding='utf-8')
# 写文件
file.write('写入新的文件内容')
file.write('没有覆盖,继续追加,关闭后再打开的才会覆盖')
# 关文件
file.close()
  • 读文件
  1. 前提:文件的打开方式限制是 r
  2. 用法:文件对象.read(n要读取的字符的数目)
  3. 返回值:读取到的⽂件内容, 类型 字符串
  4. n值不写默认读取全部
# 读取文件
file2 = open('test1.txt', 'r', encoding = 'utf-8')
res= file2.read()
print(res)
file2.close()

3. 关闭文件

将⽂件占⽤的资源进⾏清理,同时会保存⽂件, ⽂件关闭之后,这个⽂件对象就不能使⽤了
⽂件对象.close()

4. 使用 with open 打开文件

好处:会自动保存并关闭清理资源,无需再次进行 close() 操作
用法:
with open('文件路径', '参数模式', encoding='编码格式') as 文件对象名: xxxx
举例:

# 使用 with open 打开文件
with open('test1.txt', 'a', encoding='utf-8') as file3:
    file3.write('使用 with open 打开文件并写入内容,会自动保存并关闭,不需要再次close')
with open('test1.txt', 'r', encoding='utf-8') as file4:
    print(file4.read())

5. 按⾏读取⽂件内容

用法:⽂件对象.readline(),循环多次则逐层向下读取
结束标志:len(文件对象.readline()) == 0 无文件可读时

with open('test1.txt', 'r', encoding='utf-8') as file5:
    # print(file5.readline()) # 读取一行
    for i in file5: # 读取每一行
        print(i,end=" ")
    # 读取结束后 再读取为空 长度为0 
    print(file5.readline())
    print(len(file5.readline()))

二、json ⽂件的处理

1. JSON文件格式

{
  "name": "xiaoming",
  "age": 18,
  "isMale": "male",
  "hobbies": [
    "music", "game", "shopping","eat", "sleep"
  ],
  "country": "China",
  "city": "shanghai"
}

2. 读取json格式文件

  1. 导包 import json
  2. 读打开⽂件 with open(file, mode, encoding) as XXXname
  3. 读⽂件 buf = json.load(XXXname) 【buf是字典/列表】
    json.load(⽂件对象) # 返回的是 字典(⽂件中是对象)或者列表(⽂件中是数组)
import json
with open('test2.json', 'r', encoding='utf-8') as jsonFile:
    # 不使用read方法,使用load
    buf = json.load(jsonFile)
    print(type(buf))
    print(buf)
    ''' 
<class 'dict'>
{'name': 'xiaoming', 'age': 18, 'isMale': 'male', 'hobbies': ['music', 'game', 'shopping', 'eat', 'sleep'], 'country': 'China', 'city': 'shanghai'}     
    '''
    # 输出的是 字典格式
    print(buf.get('name'))#xiaoming
    print(buf.get('age'))#18
    print(buf.get('hobbies'))#['music', 'game', 'shopping', 'eat', 'sleep']

json读取练习,转为列表格式,用于自动化参数

# 练习 JSON的字典全转为列表格式
with open('test3.json', 'r', encoding='utf-8') as file2:
    new_list = []
    buf = json.load(file2)
    for item in buf:
        new_list.append((item.get('username'),item.get('password'),item.get('expect')))
    print(new_list) # [('admin', '123456', '登录成功'), ('root', '123456', '登录失败'), ('admin', '123123', '登录失败')]
    print(new_list[0]) # ('admin', '123456', '登录成功')
    print(new_list[0][0]) # admin

3. 写入json格式文件

  1. 不用 write 写入,因为不能传入 列表 or 字典,只能传入 字符串
  2. 导包 inport json
  3. 写入方式设置为 w
  4. 写入方式
    json.dup(Python的数据类型, 文件对象, ensure_ascii=False, indent=4)
    数据、文件对象名、是否以 ASCII 的⽅式显示,缩进
my_list = [('admin', '123456', '登录成功'), ('root',
'123456', '登录失败'), ('admin', '123123', '登录失败')]
with open('test4.json', 'w', encoding='utf-8') as file3:
    json.dump(my_list, file3, ensure_ascii=False, indent=4)

三、异常

Python 解释器遇到错误,会组织程序的执行,会抛出异常 raise
捕获异常:使代码继续运行,不终止

1. 异常捕获[重点]

(1)基本语法

  • 一个异常类型
    异常类型从报错信息中查看
try:
	书写可能发生异常的代码
except:   (写法2:expect 异常类型:) 
	发生了异常后去执行的代码	
  • 多个异常类型
try:
	书写可能发⽣异常的代码
except 异常类型1: # 只能捕获指定类型的异常, 如果不是这个异常,还是会报错
	发⽣了异常1执⾏的代码 
except 异常类型2:
	发⽣了异常2执⾏的代码 
except 异常类型...:
	发⽣了异常...执⾏的代码
  • 完整代码

选择性使用

try:
	pass
expect:
	pass

else:
	print('没有发⽣异常我会执⾏')
finally:
	print('不管有没有发⽣异常,我都会执⾏')
# print('不管有没有发⽣异常,我都会执⾏')

2. 异常传递[了解]

异常传递: 在函数嵌套调⽤的过程中, 被调⽤的函数 ,发⽣了异常,
如果没有捕获,会将这个异常向外层传递. …
如果传到最外层还没有捕获,才报错

应用:在主函数添加异常捕获即可
在这里插入图片描述

3. 抛出异常raise[了解]

四、练习

1. 随机数存进文件中

在这里插入图片描述

with open('data.txt','w',encoding='utf-8') as file3:
    for i in range(10):
        file3.write(f'{random.randint(1, 20)} ') # 存的时候以字符串的格式存储 空格隔开
with open('data.txt','r',encoding='utf-8') as file3:
    str_buds = file3.read()
    str_buds = str_buds[:-1] # 去掉最后的一个空格
    list_buds = str_buds.split(' ') # 去掉间隔符
# 转为整数型
new_list_buds = []
for i in list_buds:
    new_list_buds.append(int(i))
# 降序排序
new_list_buds.sort(reverse=True)
with open('data1.txt', 'w', encoding='utf-8') as file4:
    # 截取前五个 转为字符串
    file4.write(f'{new_list_buds[0:5]}')

2. 异常捕获练习

判断是否为正数 :num.isdigit()

num = input('请输入数字:')
try:
    num = int(num)
except Exception as e:
    print('输入错误',e)
else:
    if num % 2 == 0:
        print(f'{num}是偶数')
    else:
        print(f'{num}是奇数')
finally:
    print('输入完成')

五、模块与包

1. 模块

  1. 每个 .py 文件都是一个模块
  2. 模块中的【函数、变量、类】可以对外使用
  3. 对于导入的 模块 & 关键字 都可用 as 起别名

(1)导⼊模块的语法

① 方式一
  • 导入:import 模块名
  • 使用:模块名.工具名
② 方式二
  • 导入:from 模块名 import 工具名 导入模块指定内容
  • 使用:工具名 或者 工具名() 如果是类/函数要加上括号
③ 方式三[了解]
  • 导入:from 模块名 import * 导入模块所有内容
  • 使用:工具名 或者 工具名()

(2)模块的查找顺序

  1. 在导⼊模块的时候 会先在当前⽬录中找模块, 如果找到,就直接使⽤
  2. 如果没有找到回去系统的⽬录中进⾏查找, 找到,直接使⽤
  3. 没有找到, 报错
  4. 注意点:
    定义代码⽂件的时候, 你的代码名字不能和你要导⼊的模块名字相同

(3)__name__变量名的作⽤

  1. 导入模块的时候,会执行模块中的代码
  2. __name__变量 是 python解释器自动维护的变量
  3. __name__变量如果直接运行,那么值是__main__
  4. __name__变量如果是被导入执行的,那么值是导入的模块名
  5. 判断使用方式:if (__name__ == '__main__'):...
  6. 即:只要导包,就不是当前模块

在这里插入图片描述
在这里插入图片描述

2. 包

  1. 一个目录,存在一个文件 __init__.py 文件
  2. 该文件:将功能相近或者相似的代码放一起
  3. 不需要区分是包还是模块
    random 模块 (单个代码⽂件)
    json 包(⽬录)
    unittest 包(⽬录)
  1. import 包名
  2. alt 回⻋ 快捷导⼊
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值