目录
一、模块和包
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 中已经实现好了,我们不需要操作, 我们知道异常会进⾏传递.
异常传递: 在函数嵌套调⽤的过程中, 被调⽤的函数 ,发⽣了异常,如果没有捕获,会将这个异常向外层传递. .... 如果传到最 外层还没有捕获,才报错