软件测试 —— Python(六)之异常、模块和包、文件操作

其他Python知识参考:Python学习路线

目录

一、模块和包

1、导⼊模块的语法

2、模块的查找顺序

3、__name__ 的作⽤

4、包(package)

二、 ⽂件操作

1、⽂件介绍

1.1、⽂本⽂件

1.2、⼆进制⽂件

2、⽂件操作的步骤

2.1、打开⽂件 

2.2、写⽂件

2.3、读⽂件

2.4、关闭⽂件

3、使⽤ with open 打开⽂件

4、按⾏读取⽂件内容

5、json ⽂件的处理 

5.1、json 的介绍

5.2、json ⽂件的语法

5.3、json ⽂件的书写

5.4、读取 json ⽂件

5.5、json 的写⼊

三、异常

1、基本语法

2、捕获多个指定类型的异常

3、异常捕获的完整版本

 4、异常传递(了解)


其他Python知识参考:Python学习路线

一、模块和包

1. Python 源代码⽂件就是⼀个模块

2. 模块中定义的变量 函数 类,都可以让别⼈使⽤,同样,可以使 ⽤别⼈定义的(好处: 别⼈定义好的不需要我们再次书写,直接使⽤即可)

3. 想要使⽤ 别⼈的模块中的内容⼯具(变量, 类, 函数), 必须 先导⼊模块 才可以

4. 我们⾃⼰写的代码,想要作为模块使⽤,代码的名字需要满⾜标 识符的规则(由数字,字⺟下划线组成,不能以数字开头)

1、导⼊模块的语法

# 方式一:
import 模块名 
# 使⽤模块中的内容 
模块名.⼯具名

# 举例 
import random 
import json 
random.randint(a, b) 
json.load() 
json.dump()

# 方式二:
from 模块名 import ⼯具名 
# 使⽤ 
⼯具名 # 如果是函数和类需要加括号

# 举例 
from random import randint 
from json import load, dump 
randint(a, b) 
load() 
dump()

# ⽅式三 [了解] 基本不⽤
from 模块名 import *

from random import * 
from json import *

randint(a, b) 
load() 
dump()

对于导⼊的模块和⼯具可以使⽤ as 关键字给其起别名

注意: 如果起别名,原来的名字就不能⽤了, 只能使⽤别名 

2、模块的查找顺序

在导⼊模块的时候 会先在当前⽬录中找模块, 如果找到,就直接 使⽤ 如果没有找到回去系统的⽬录中进⾏查找, 找到,直接使⽤ 没有找到, 报错

注意:

定义代码⽂件的时候, 你的代码名字不能和你要导⼊的模块名字相同

3、__name__ 的作⽤

1. 每个代码⽂件都是⼀个模块

2. 在导⼊模块的时候, 会执⾏模块中的代码(三种⽅法都会)

3. __name__ 变量

        3.1 __name__ 变量 是 python 解释器⾃动维护的变量

        3.2 __name__ 变量,如果代码是直接运⾏, 值是 "__main__"

        3.3 __name__ 变量, 如果代码是被导⼊执⾏, 值是 模块名(即 代码⽂件名)

在代码⽂件中, 在被导⼊时不想被执⾏的代码,可以写在 if __name__ == "__main__": 代码的缩进中

4、包(package)

在 Python 中, 包 是⼀个⽬录, 只不过在这个⽬录存在⼀个⽂ 件 __init__.py(可以是空的) 将功能相近或者相似的代码放在⼀起的.

-------

在 Python 中使⽤的时候,不需要可以是区分是包还是模块, 使⽤⽅式是⼀样的

random 模块 (单个代码⽂件) json 包(⽬录) unittest 包(⽬录)

1. import 包名

2. alt + 回⻋ => 快捷导⼊

二、 ⽂件操作

1、⽂件介绍

计算机的 ⽂件,就是存储在某种 ⻓期储存设备 上的⼀段 数据

作⽤: 将数据⻓期保存下来,在需要的时候使⽤

1.计算机只认识 ⼆进制(0 1)

2.⽂件中存储的数据都是以⼆进制(0 1) 的形式去存储的

可以根据⽂件中的⼆进制内容,能否使⽤记事本软件将其转换为⽂字, 将⽂件分为两种: ⽂本⽂件⼆进制⽂件

1.1、⽂本⽂件

能够使⽤记事本软件打开(能够使⽤记事本转换为⽂字)

txt, md,  py , html, css, js , json

1.2、⼆进制⽂件

不能使⽤记事本软件打开的

exe, mp3, mp4, jpg, png 等  

我们操作的基本都是⽂本⽂件 

2、⽂件操作的步骤

1. 打开⽂件

2. 读或者写⽂件

3. 关闭⽂件

2.1、打开⽂件 

打开⽂件: 将⽂件从磁盘(硬盘) 中 读取到内存中

语法:

open(file, mode='r', encoding=None)

        > 参数 file: 是要打开的⽂件, 类型是字符串, ⽂件的路径可以是相对路径,也可以是绝对路径(从根⽬录开始书写的路 径),建议使⽤相对路径(相对于当前代码⽂件所在的路径, ./ ../ )

        > 参数 mode: 默认参数(缺省参数), 表示的是打开⽂件的⽅式

                r: read 只读打开

                w: write 只写打开

                a: append 追加打开, 在⽂件的末尾写⼊内容

        > 参数 encoding: 编码⽅式,(⽂字和⼆进制如何进⾏转换的)

                gbk: 将⼀个汉字转换为 2 个字节⼆进制

                utf-8: 常⽤, 将⼀个汉字转换为 3 个字节的⼆进 制

        > 返回值: 返回的是⽂件对象, 后续对⽂件的操作,都需要这个对象

2.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()

2.3、读⽂件

将⽂件中的内容读取出来

前提: ⽂件的打开⽅式需要是 r

⽂件对象.read(n)

# 参数 n 表示读取多少个字符, ⼀般不写,表示读取全部内容

# 返回值: 读取到的⽂件内容, 类型 字符串

# 1, 打开⽂件 
f = open('a.txt', 'r', encoding='utf-8') 
# 2, 读⽂件 
buf = f.read() print(buf) 
# ⽬前只是打印读取的内容,可以做其它的事 
# 3. 关闭⽂件 
f.close()

# r ⽅式打开⽂件 ,如果⽂件不存在,代码会报错

2.4、关闭⽂件

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

⽂件对象.close() 

3、使⽤ 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 ⽅式打开⽂件, ⽂件不存在会创建⽂件, ⽂件存在, 在⽂件的末尾写⼊内容

4、按⾏读取⽂件内容

按⾏读取⽂件: ⼀次读取⼀⾏内容

⽂件对象.readline() 

# read() 和 readline() 读到⽂件末尾, 返回⼀个空字符串, 即⻓度为 0
with open('b.txt', encoding='utf-8') as f: 
    while True: 
        buf = f.readline() 
        if len(buf) == 0: 
            break 
        else: 
            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) != 0
            print(buf) 
        else:
            break

5、json ⽂件的处理 

json ⽂件 也是⼀个⽂本⽂件, 就可以直接使⽤ read()write() ⽅法去操作⽂件, 只是使⽤这两个⽅法,不⽅便,所以 对 json ⽂件有⾃⼰独特的读取和写⼊的⽅法

常⽤在 在做测试的时候, 将测试数据定义为 json ⽂件格式, 使⽤代码读取 json ⽂件,即读取测试数据, 进⾏传参(参数化)

5.1、json 的介绍

json 基于⽂本,独⽴于语⾔的轻量级的数据交换格式

- 基于⽂本, 是⼀个⽂本⽂件, 不能包含图⽚,⾳视频等

- 独⽴于语⾔, 不是某个语⾔特有的, 每种编程语⾔都可以使⽤ 的

- 轻量级, 相同的数据, 和其他格式相⽐,占⽤的⼤⼩⽐较⼩

- 数据交换格式, 后端程序员 给前端的数据 (json, html ,xml)

5.2、json ⽂件的语法

1. json ⽂件的后缀是 .json

2. json 中主要数据类型为 对象({} 类似 Python 中 字典) 和 数组([], 类似 Python 中的列表), 对象和数组可以互相嵌套

3. ⼀个json ⽂件是⼀个 对象或者数组(即 json ⽂件的最外层 要么是⼀个 {}, 要么是⼀个 数组 [])

4. json 中的对象是由键值对组成的, 每个数据之间使⽤逗号隔开,但是最后⼀个数据后边不要写逗号

5. json 中的字符串 必须使⽤双引号

6. json 中的其他数据类型

        > 数字类型 ----> int float

        > 字符串 string ---> str

        > 布尔类型 true, false -----> True, False

        > 空类型 null ----> None

5.3、json ⽂件的书写

# 我叫⼩明,我今年 18 岁,性别男, 爱好 听歌, 游戏,购物,吃饭, 睡觉,打⾖⾖, 
# 我的居住地址为 国家中国, 城市上海
{
    "name": "⼩明", 
    "age": 18,
    "isMen": true, 
    "like": [ 
        "听歌", 
        "游戏", 
        "购物", 
        "吃饭", 
        "睡觉", 
        "打⾖⾖" 
    ],
    "address": {
        "country": "中国",
        "city": "上海"

    }
}

5.4、读取 json ⽂件

1. 导包 import json

2. 读打开⽂件

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'))

5.5、json 的写⼊

⽂件对象.write(字符串) 不能直接将 Python 的列表字典作为参数传递;

想要将 Python 中的数据类型存为 json ⽂件, 需要使⽤ json 提供的⽅法, 不再使⽤ write

步骤:

1. 导包 import json

2. 写(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)

三、异常

1、基本语法

try:
    书写可能发⽣异常的代码 
except: # 任何类型的异常都能捕获 
    发⽣了异常执⾏的代码

try:

    书写可能发⽣异常的代码 
except 异常类型: # 只能捕获指定类型的异常, 如果不是这个异常,还是会报错
    发⽣了异常执⾏的代码


# 示例
try:
    # 1. 获取⽤户从键盘输⼊的数据 
    num = input('请输⼊数字:') 
    # 2. 转换数据类型为整数 
    num = int(num) 
    # 3. 输出转换之后的数据内容 
    print(num) 
except:
    print('请输⼊正确的数字')

print('后续其他的代码,可以继续执⾏')

try:
    # 1. 获取⽤户从键盘输⼊的数据
    num = input('请输⼊数字:')
    # 2. 转换数据类型为整数 
    num = int(num) # 
    3. 输出转换之后的数据内容 
    print(num)
except ValueError: # 只能捕获 ValueError 类型及其⼦类的异常 
    print('发⽣了异常, 请输⼊正确的数字...')

2、捕获多个指定类型的异常

好处: 可以针对不同的异常错误,进⾏单独的代码处理  

try:
    书写可能发⽣异常的代码 
except 异常类型1: # 只能捕获指定类型的异常, 如果不是这 个异常,还是会报错
    发⽣了异常1执⾏的代码 
except 异常类型2:
    发⽣了异常2执⾏的代码 
except 异常类型...:
    发⽣了异常...执⾏的代码

# 示例
try:
    # 1. 获取⽤户从键盘输⼊的数据
    num = input('请输⼊数字:')
    # 2. 转换数据类型为整数 
    num = int(num) 
    # 3. 输出转换之后的数据内容 
    print(num)
    a = 10 / num  # 10 / 0
    print(f'a: {a}')
except ValueError: # 只能捕获 ValueError 类型及其⼦类的异常
    print('发⽣了异常, 请输⼊正确的数字...')
except ZeroDivisionError:
    print('除数不能为 0')

3、异常捕获的完整版本

try:
    可能发⽣异常的代码 
except 异常类型1:
    发⽣异常类型1执⾏的代码 
# Exception 是常⻅异常类的⽗类, 这⾥书写 Exception,可以捕获常⻅的所有⼀会, 
# as 变量, 这个变量是⼀个异常类的对象, print(变量) 可以打印异常信息 
except Exception as 变量:
    发⽣其他类型的异常,执⾏的代码 
else:
    没有发⽣异常会执⾏的代码 
finally:
    不管有没有发⽣异常,都会执⾏的代码

try:
    可能发⽣异常的代码 
except Exception as e:
    发⽣异常执⾏的代码

# 示例
try:
    # 1. 获取⽤户从键盘输⼊的数据 
    num = input('请输⼊数字:') 
    # 2. 转换数据类型为整数 
    num = int(num) 
    # 3. 输出转换之后的数据内容 
    print(num)
    a = 10 / num  # 10 / 0
    print(f'a: {a}')
except Exception as e:
    print(f"错误信息为: {e}") 
else:
    print('没有发⽣异常我会执⾏') 
finally:
    print('不管有没有发⽣异常,我都会执⾏')

 4、异常传递(了解)

异常传递是 Python 中已经实现好了,我们不需要操作, 我们知道异常会进⾏传递.

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

其他Python知识参考:Python学习路线

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心上学事上练

感谢您的支持,让我们一起成长

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值