一、文件操作
1. 打开文件
- 基本语法:
文件对象 = open(file, mode='r', encoding=None)
- 参数说明
- file 要打开的文件,字符串类型,一般写相对路径
- mode 默认参数(缺省参数),表示打开文件的方式
r : read 只读打开
w : write 只写打开
a > append 追加打开,末尾写入
参数 encoding 编码方式(文字&二进制之间的转换)
gbk 汉字转换为2个字节二进制
utf-8 汉字转为3个字节的二进制- 返回值
返回的是文件对象
2. 读或者写文件
- 写文件
- 前提:文件的打开方式限制是
w 或 a
- 用法:
文件对象.write('写入的内容')
- 返回值:写入的内容的字符数(一般不关注)
- 文件存在会进行覆盖,文件不存在会直接创建
# 打开文件
file = open('test1.txt', 'w',encoding='utf-8')
# 写文件
file.write('写入新的文件内容')
file.write('没有覆盖,继续追加,关闭后再打开的才会覆盖')
# 关文件
file.close()
- 读文件
- 前提:文件的打开方式限制是
r
- 用法:
文件对象.read(n要读取的字符的数目)
- 返回值:读取到的⽂件内容, 类型 字符串
- 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格式文件
- 导包
import json
- 读打开⽂件
with open(file, mode, encoding) as XXXname
- 读⽂件
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格式文件
- 不用
write
写入,因为不能传入 列表 or 字典,只能传入 字符串- 导包
inport json
- 写入方式设置为
w
- 写入方式
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. 模块
- 每个
.py
文件都是一个模块- 模块中的【函数、变量、类】可以对外使用
- 对于导入的 模块 & 关键字 都可用
as
起别名
(1)导⼊模块的语法
① 方式一
- 导入:
import 模块名
- 使用:
模块名.工具名
② 方式二
- 导入:
from 模块名 import 工具名
导入模块指定内容 - 使用:
工具名 或者 工具名()
如果是类/函数要加上括号
③ 方式三[了解]
- 导入:
from 模块名 import *
导入模块所有内容 - 使用:
工具名 或者 工具名()
(2)模块的查找顺序
- 在导⼊模块的时候 会先在当前⽬录中找模块, 如果找到,就直接使⽤
- 如果没有找到回去系统的⽬录中进⾏查找, 找到,直接使⽤
- 没有找到, 报错
- 注意点:
定义代码⽂件的时候, 你的代码名字不能和你要导⼊的模块名字相同
(3)__name__
变量名的作⽤
- 导入模块的时候,会执行模块中的代码
__name__
变量 是 python解释器自动维护的变量__name__
变量如果直接运行,那么值是__main__
__name__
变量如果是被导入执行的,那么值是导入的模块名
- 判断使用方式:
if (__name__ == '__main__'):...
- 即:只要导包,就不是当前模块
2. 包
- 一个目录,存在一个文件
__init__.py
文件- 该文件:将功能相近或者相似的代码放一起
- 不需要区分是包还是模块
random 模块 (单个代码⽂件)
json 包(⽬录)
unittest 包(⽬录)
- import 包名
- alt 回⻋ 快捷导⼊