1.文件打开的简写方式:文件打开操作完成后,会自动关闭文件
with open(filenpath,) as fileobject:
fileobject().read()
with open(r'd:/error.PNG','rb') as fileobj:
for line in fileobj:
print(type(line))#bytes是python中的内置的数据类型,用来表示二进制
print(line)
with open(r'd:/error.PNG','rb') as fileobj:
content = fileobj.read()
with open('./new.jpg','wb') as ff:
ff.write(content)
应用:上传文件或者上传图片,下载图片或者下载文件
2.json文件:有特定格式的一种文本形式,它有自己的语法,json文件就是后缀是.json的文本文件
1.json格式对应的数据类型及其表现
a.一个json文件中只能存一个数据,这个数据的类型必须是以下类型中的一种
类型 | 格式 | 意义 |
---|---|---|
对象类型(object) | {"a":10,"b":[1,2]} | 相当于字典 |
数组(array) | [100,"abc"] | 相当于列表,里面的元素可以是任何类型 |
数字(number) | 100,3.14,-100 | 包含整数和小数 |
字符串(string) | "abc","hello.json" | 必须是双引号 |
布尔 | true/false | 真/假 |
特殊值null | null | 空值 |
数据接口业务:
import json
#jso模块是python中内置的,专门用来处理json数据的一个模块
2.json.load(fileobj):以json格式,获取文件中的内容,并将内容转换成相应的python数据
3.loads(json格式字符串,编码方式):将json格式的字符串转换成python对应的数据
4.python对json数据的支持
json | 转换成 | python |
---|---|---|
json | ---> | python |
对象 | 字典(dict) | |
数组 | 列表(list) | |
数字 | 整数(int)和浮点数(float) | |
布尔/true,false | 布尔/True,False | |
null | None |
4.python转换成json
python | 转换成 | json |
---|---|---|
python | ---> | json |
字典 | 对象 | |
列表、元组 | 数组 | |
整数/浮点数 | 数字 | |
布尔/True,False | true,flase | |
字符串 | 字符串(双引号) | |
None | null |
···
with open('json3.json','w',encoding='utf-8') as f:
# lst=["name",{"username":"lisi"},{"password":"123456"}]
# json.dump(lst,f)
# json.dump((1,2,3),f)
# json.dump(True,f)
# json.dump({1,2,3},f) #注意:python中的集合不能转换成json数据,会报错
json.dump(None,f)
···
5.向json文件写数据的方法json.dump(需要写入json文件中的python数据,json文件对象)
dumps(需要转换成json格式字符串的python数据):把python中的数据转换成对应的json格式的字符串
···
jsonstr = json.dumps([1,2,3])
print(type(jsonstr)) #<class 'str'>
···
注意:python中的集合不能转换成json数据,会报错
练习:用json文件来保存一个班的班级信息,包括班级名,和班上的所有的学生(包含名字,年龄和电话)
可以输入信息,添加学生,也可以根据姓名删除学生,删除之后也是永久有效的。做到数据持久化
import json
if __name__=='__main__':
with open('json2.json','r',encoding='utf-8') as f:
content=json.load(f)
print(type(content[1]['username']))
print(type(json.loads(r'{"a":12}',encoding='utf-8')))
with open('json3.json','w',encoding='utf-8') as f:
# lst=["name",{"username":"lisi"},{"password":"123456"}]
# json.dump(lst,f)
# json.dump((1,2,3),f)
# json.dump(True,f)
# json.dump({1,2,3},f) #注意:python中的集合不能转换成json数据,会报错
json.dump(None,f)
#练习:用json文件来保存一个班的班级信息,包括班级名,和班上的所有的学生(包含名字,年龄和电话)
#可以输入信息,添加学生,也可以根据姓名删除学生,删除之后也是永久有效的
dicall={'classname':'python1806','stumessage':[]}
while True:
print('1.添加学生')
print('2.删除学生')
print('3.查看学生')
print('4.退出')
op = int(input('请输入你的选择:'))
try:
with open('stu.json','r',encoding='utf-8') as f:
dicall = json.load(f)
if op==1:
with open('stu.json','w',encoding='utf-8') as f2:
dicall['classname']='python1806'
name = input('请输入姓名:')
age = input('请输入年龄:')
pnum = input('请输入电话号码:')
dic={'name':name,'age':age,'pnum':pnum}
dicall['stumessage'].append(dic)
json.dump(dicall,f2)
print('保存成功')
elif op==2:
name = input('请输入你要删除的学生名字:')
for student in dicall['stumessage']:
if student['name'] == name:
dicall['stumessage'].remove(student)
with open('stu.json','w',encoding='utf-8') as f3:
json.dump(dicall,f3)
print("删除成功")
break
elif op==3:
print('班级:%s'%dicall['classname'])
for student in dicall['stumessage']:
print('姓名:%s,年龄:%s,电话号码:%s'%(student['name'],student['age'],student['pnum']))
elif op==4:
exit(0)
except:
with open('stu.json', 'w', encoding='utf-8') as f2:
dicall['classname'] = 'python1806'
name = input('请输入姓名:')
age = input('请输入年龄:')
pnum = input('请输入电话号码:')
dic = {'name': name, 'age': age, 'pnum': pnum}
dicall['stumessage'].append(dic)
json.dump(dicall, f2)
print('保存成功')
3.异常:程序崩溃了,报错了...
1.程序出现异常,但是不想因为这个异常而让程序崩溃。这个时候就可以使用异常捕获机制
例,输入两个数,然后求这两个数的商,输入的不是数字或者被除数为0
try:
num1 = input('please input num1:')
num2 = input('please input num2:')
print(num1/num2)
except:
print('你输入的数据非法')
例:打开一个不存在的文件,不希望程序崩溃,只是让程序为空
try
with open('haha.txt') as f:
pass
except:
print('文件不存在')
2.怎么捕获异常
形式1:捕获try代码块里面所有异常
try:
需要捕获异常的代码块(可能会出现异常的代码块
except:
出现异常后执行代码
其他语句
执行过程:执行try后面的代码块,一旦遇到异常,就马上执行except后面的代码块。执行完后再执行其他的语句
如果try里面的代码块没有出现异常,就不执行except后面的代码块,而是直接执行其他语句
形式2:
try:
需要捕获异常的代码块(可能会出现异常的代码块
except 错误类型:
出现异常后执行代码
其他语句
执行过程:执行try后面的代码块,一旦遇到指定错误了下异常,就马上执行except后面的代码块。执行完后再执行其他的语句
如果try里面的代码块没有出现异常,就不执行except后面的代码块,而是直接执行其他语句
dict =['a':1,'b':2]
try:
dict1['c']
print(a[6])
except (IndexError,KeyError):
print('下标越界')
c.形式3
try:
需要捕获异常的代码块(可能会出现异常的代码块
except (错误类型1,错误类型2...):
出现异常后执行代码
其他语句
d.形式4
try:
需要捕获异常的代码块(可能会出现异常的代码块
except 错误类型1:
出现错误类型1执行代码1
except 错误类型2:
出现错误类型2执行代码2
...z
其他语句
练习1:
while True:
try:
num1=float(input('请输入数字1:'))
num2=float(input('请输入数字2:'))
print(r'%.2f/%.2f,%.2f'%(num1,num2,num1/num2))
exit(0)
except ValueError:
print('不能输入非数字字符')
except ZeroDivisionError:
print('除数不能为0')
d.形式5
try:
需要捕获异常的代码块(可能会出现异常的代码块)
except:
出现异常后执行代码
finally:
不管有没有异常,都会执行,可以作为文件关闭,密码,程序异常退出的善后以及回滚
3.抛出异常后面补充)
raise 错误类型
num = input('请输入一个奇数:')
if int(num)%2 == 0
raise KeyError