一、打开文件和关闭文件的缩写
1.二进制文件的缩写
语法:with open(文件路径,打开方式,编码方式(encoding)) as 文件对象:
文件操作相关的代码
encoding:只对文本文件有效
说明:打开文件后,执行完文件操作后,会自动关闭打开的这个文件
注意:当打开文件时,如果以读的方式打开,文件不存在就会报错;如果以写的方式打开并且文件不存在会在对应的目录下创建对应文件
with open('./files/aaa.txt', 'w', encoding=None) as f1:
f1.write('床前明月光,\n疑是地上霜\n')
open('./files/aaa.txt', 'w', encoding=None)
二、二进制文件的读写
注意:二进制文件不能设置编码方式
常见的二进制文件:视频文件,音频文件,图片,压缩包等都属于二进制文件
with open('./files/photo.jpg', 'rb') as f2:
content = f2.read()
print(content)
# bytes:字节,是Python专门用来表示二进制数据类型
with open('./files/new.jpg', 'wb') as f2:
f2.write(content)
三、json文件
1.什么是json数据
json是一种特定格式的数据,主要用来在互联网上做文本数据传输。
主流的数据传输格式:json和xml,但最主要用json格式
json数据本身是文本数据,json文件就是后缀是.json的文件,并且文件内容必须瞒足json格式要求,如果不满足格式文件会报错
2.json格式
要求:
- a.一个json对应一条数据,
- b.json中的数据必须是json对应的数据类型
- c.数字类型(number):所有数字,包含整数和小数,例如:100,12.3
- d.字符串类型(string):json中用双引号括起来的数据,例如:“你好json”
- e.容器类型(数组(array相当于Python中的列表)如:[123, "wo", "你好"],字典(dictionary)相当于Python中的字典,如:{"a": 100, "abc": "你好", "dict1":{"xiaoming": 12}, "array1": [1,2]})
- f.布尔:要求true和false都要小写,但在Python中首字母必须大写
- g.null: 相当于Python中的None(空)
with open('./files/test.json', 'r', encoding='utf-8') as f1:
print(f1.read())
3.python对json的支持
Python中专门提供了一个json模块用来处理json数据
-
a.
load(json文件对象) :将json文件内容读出来,并且将内容转换成Python对应的数据类型
dump(写入对象,json文件路径) :将指定的内容以json格式写入指定的json文件中 -
b.
loads(json格式的字符串): 将字符串内容是json数据的字符串转换成Python对应的数据类型
json格式的字符串:必须瞒足json的类型要求
dumps(内容) :将指定的内容转换成json格式的字符串
I. loads(json格式的字符串)
# json格式的字符串:必须瞒足json的类型要求
import json
# json转Python
# 整数 -> 整数int/float
content = json.loads('100')
print(content)
# 字符串 -> 单引号的str
content = json.loads('"abc"')
print(content)
# 数组 -> list
content = json.loads('[12, 23, "name", [1, "2a"]]')
print(content)
print(type(content))
# 字典 -> dict
content = json.loads('{"name":"xiaoming", "b": true, "score":[73, 34, 78]}')
print(content)
print(type(content))
# null -> None
content = json.loads('{"bools": null, "b": true, "score":[73, 34, 78]}')
print(content)
print(type(content))
# 以上所有操作相当于load(文件对象)
# load(文件对象):将文件对象的内容转换成Python数据类型数据,要求文件的内容必须是json格式的数据
with open('./files/test.json', encoding='utf-8') as f:
print(f.read())
II. dumps(内容)
dumps(内容):内容是Python数据,该函数返回值是一个字符串,并且字符串的内容是瞒足json格式的
Python转json如下:
int/float | 数字 |
---|---|
str | 字符串(会将单引号变成双引号) |
dict | 字典 |
list/tuple | 数组 |
None | null |
# dict -> 字典
str1 = json.dumps([1, 2, {'a':True, 'name': 12.5, 'str1':'abcc'}])
print(str1)
print(type(str1))
# list -> 数组
str1 = json.dumps([1, 12.3,45])
print(str1)
print(type(str1))
# tuple -> 数组
str1 = json.dumps((1, 12.3, 90))
print(str1)
print(type(str1))
注意:除了上面列出的类型,其他类型都不能转换成json类型
以上dumps的所有操作,相当于dump
dump(内容,文件对象): 将内容以json格式写入文件
with open('./files/test.json', 'w') as f:
json.dump([1, 2, {'a':True, 'name': 12.5, 'str1':'abcc'}], f)
练习:
数据本地化
第一次使用的时候从本地文件中取数据;修改完数据后要用新的数据更新本地文件中的内容
学生管理系统
1、添加功能,添加过的下次还存在
2、显示学生
import json
with open('./files/students.json') as f:
all_student = json.load(f)
def add_student():
"""
添加学生
:return:
"""
while True:
name = input('请输入学生姓名:')
age = input('请输入学生年龄:')
tel = input('请输入学生的电话:')
student = {'name': name, 'age': age, 'tel': tel}
all_student.append(student)
print('添加成功!')
print('1、继续添加')
print('2、返回上一层')
input_value = input('请选择1 - 2:')
if input_value == '1':
continue
else:
return
def show_student():
for stu in all_student:
print(stu)
while True:
print('==============================')
print('1、添加学生')
print('2、显示学生')
print('3、退出')
print('==============================')
input_value = input('请选择1 - 3:')
if input_value == '1':
add_student()
elif input_value == '2':
show_student()
else:
break
with open('./files/students.json', 'w') as f:
json.dump(all_student, f)
在程序中声明一个变量用来保存在运行次数
with open('./files/times.json') as f:
times = json.load(f)
times += 1
print('次数:', times)
print('结束')
with open('./files/times.json', 'w') as f:
json.dump(times, f)
异常处理
1、什么是异常
异常:报错就是出现异常,并且程序后面的代码不会执行,程序直接执行
2、异常捕获
出现异常后不希望程序直接结束,而是要自己对这个异常进行处理,就需要捕获异常
语法:
* a.
try:
需要捕获异常的代码段
except:
出现异常需要执行的代码段
finally:
代码段3
* b.
try:
需要捕获异常的代码段
except 异常类型:
代码段2
# 捕获代码段1中指定类型的异常
finally:
代码段3
* c.
try:
# 需要捕获异常的代码段
except(异常类型1,异常类型2,.....):
代码段2
finally:
代码段3
* d.
try:
需要捕获异常的代码段
except 异常类型1:
代码段2
except 异常类型2:
代码段3
.....
finally:
代码段3
# finally内的代码段无论如何都会执行
try内如果发生异常发生异常的代码后面的代码不会执行,而except后面的代码只有try中发生异常时才会执行,并且出现异常程序不会结束
try:
value = input()
int_value = float(value)
except:
print('异常出现了')
print('输入错误')
try:
print({'aa':12}['bb'])
print([1, 2][3])
except IndexError:
print('下标越界')
try:
print({'aa':12}['bb'])
print([1, 2][3])
except (IndexError, KeyError, TypeError):
print('异常')
3、finally后面的代码一定会执行,( 不管try里面的代码会不会出现异常,以及出现异常后是否被捕获)
try:
print([1, 2][0])
except IndexError:
print('出现异常了')
finally:
print('程序最后执行代码')
print('结束')
4、抛出异常
语法:raise 异常类型
异常类型要求:是Exception类的子类
value = int(input('请输入偶数:'))
if value & 1:
raise ValueError
else:
print('还行')
网友评论