day13、json数据、网络请求、异常 2019-01-09
一、复习
1.打开文件 --> 操作文件 --> 关闭文件
文件对象 = open(文件路径, 打开方式, encoding='utf-8')
./
././
r, w, rb, wb, a
with open(文件路径,打开方式,encoding='utf-8') as 文件对象
2.文件对象.read() or 文件对象.readline()
文件对象.write()
3.数据持久化的方法
需要使用数据的时候先从文件中读出来
数据修改后,将最新的数据保存到文件中
二、json
1.什么是 json 数据
json 是一种具有特定语法的数据格式。
2.json 数据的语法
一个 json 数据有且只有一个数据;这个数据的数据类型必须是 json 支持的数据类型。
3.json 支持的数据类型
a.数字类型(number):包括所有的数字;包括整数、小数,例如: 10 、 12.25 、 -20 等。
注意:正数前面不能加 ‘+’,支持科学技术法(20e1)。
b.字符串(string):使用双引号括起来的数据(只能是双引号);例如:"132……&*"、"ASDGVC@#$%"、"asdaffgd"。
c.布尔(bool):只有 true 和 false 两个值(首字母小写)。
d.数组(list):相当于python的列表,用[]括起来,多个元素用逗号隔开;例如:[123, "adc", [1, 2]]
e.字典(dict):相当于python中的字典,用{}括起来,多个键值对用逗号隔开,例如:{"a": 1, "d": 2, "c": 3}
f.空值(null):相当于python中的 None 。
4.python处理 json 数据
python 提供了 json 模块,专门用来处理 json 数据。
1).将 json 数据转换成 python 数据:
a.转换方式
将 json 数据转换成 python 数据(通过爬虫获取到别人提供的 json 数据,在 python 中处理)
json --> python
数字 --> int/float
字符串 --> str,可能双引号会变成单引号。
布尔值 --> bool,会将 json 中的 true/false 转换成 True/False(首字母大写)。
数组 --> list
字典 --> dict
空值(null) --> None
b.loads 方法
loads(字符串, encoding='utf-8') -----将字符串中的 json 数据转换成对应的 python 数据。
注意:这里的字符串中的内容必须是 json 数据
2).将 python 数据转换成 json 数据( python 写后台接口将数据提供给客户端):
a.转换方式
python --> json
int/float --> 数字字符串
str --> 字符串
bool --> 布尔值,大写变小写
list/tuple --> 数组
dict --> 字典
空值(None) --> null
注意:集合不支持转换成 json 数据。
b.dumps(对象) -----将指定的对象转换成 json 数据,以字符串的形式返回
这里的对象指的就是 python 数据
注意:返回值是字符串,并且字符串的内容是 json 内容。
5.json 文件处理
严格来说, json 文件是文件内容是 json 数据的文件。
load(文件对象) -----将指定文件中的内容读出来,并且转换成 python 对应的内容。
注意:这里的文件对象对应的文件必须是 json 文件。
dump(对象, 文件对象) -----将指定的对象喜欢喝成内容是 json 格式的字符串,然后写入指定的文件中。
注意:这里的对象对应的类型必须是能够转换成 json 的数据类型。
例如:
import json
def main():
# 将 python 中 的数据转换成 json 数据
result1 = json.dumps(100.23)
print(result1, type(result1))
result2 = json.dumps('adc')
print(result2, type(result2)) # 单引号会转换成双引号
# 将 json 中 的数据转换成 python 数据
content1 = json.loads('"adc"', encoding='utf-8')
print(content1, type(content1)) # 结果为:adc <class 'str'.
content2 = json.loads('{"name": "张三", "sex": "男", "age": 21}', encoding='utf-8')
print(content2, type(content2))
# 将 json 中 的数据转换成 python 数据
# with open('./test.json', encoding='utf-8') as f:
# info = f.read()
# print(info, type(info))
# dict1 = json.load(info, encoding='utf-8')
# for i in dict1['data']:
# print(i['ur1'])
# 读 json 文件
with open('./test.json', encoding='utf-8') as f:
result3 = json.load(f)
print(type(result3), result3)
# all_student = [
# {'name': '阿黄', 'age': 21},
# {'name': '小白', 'age': 45},
# {'name': '小黄', 'age': 12}
# ]
# with open('./student.json', 'w', encoding='utf-8') as f:
# json.dump(all_student, f) # 相当于:f.write(json.dumps(all_student))
# with open('./student.json', encoding='utf-8') as f:
# result4 = json.load(f)
# print(type(result3), result4)
with open('./student.json', 'r', encoding='utf-8') as f:
all_student = json.load(f)
add_student(all_student)
add_student(all_student)
with open('./student.json', 'w', encoding='utf-8') as f:
json.dump(all_student, f)
def add_student(list1: list):
name = input('name:')
age = int(input('age:'))
score = float(input('score:'))
list1.append({'name': name, 'age': age, 'score': score})
if __name__ == '__main__':
main()
运行结果:
100.23 <class 'str'>
"adc" <class 'str'>
adc <class 'str'>
{'name': '张三', 'sex': '男', 'age': 21} <class 'dict'>
<class 'dict'> {'code': 200, 'msg': '成功!', 'data': [{'createdAt': '2017-11-23T08:32:29.546Z', 'publishedAt': '2017-11-24T11:08:03.624Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171123083218_5mhRLg_sakura.gun_23_11_2017_8_32_9_312.jpeg'}, {'createdAt': '2017-11-20T07:49:41.797Z', 'publishedAt': '2017-11-20T12:42:06.454Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171120074925_ZXDh6l_joanne_722_20_11_2017_7_49_16_336.jpeg'}, {'createdAt': '2017-11-17T10:31:41.155Z', 'publishedAt': '2017-11-17T12:39:48.189Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/2017-11-17-22794158_128707347832045_9158114204975104000_n.jpg'}, {'createdAt': '2017-11-16T11:57:11.4Z', 'publishedAt': '2017-11-16T12:01:05.619Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171116115656_vnsrab_Screenshot.jpeg'}, {'createdAt': '2017-11-14T10:13:21.137Z', 'publishedAt': '2017-11-14T10:43:36.180Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171114101305_NIAzCK_rakukoo_14_11_2017_10_12_58_703.jpeg'}, {'createdAt': '2017-11-13T08:42:35.306Z', 'publishedAt': '2017-11-13T12:10:58.643Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171113084220_LuJgqv_sakura.gun_13_11_2017_8_42_12_311.jpeg'}, {'createdAt': '2017-11-09T09:53:06.802Z', 'publishedAt': '2017-11-10T08:10:02.838Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171109095254_dOw5qh_bluenamchu_9_11_2017_9_52_47_256.jpeg'}, {'createdAt': '2017-11-07T10:02:58.73Z', 'publishedAt': '2017-11-08T11:00:50.559Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171107100244_0fbENB_yyannwong_7_11_2017_10_2_5_982.jpeg'}, {'createdAt': '2017-11-02T09:23:05.497Z', 'publishedAt': '2017-11-06T12:40:39.976Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171102092251_AY0l4b_alrisaa_2_11_2017_9_22_44_335.jpeg'}, {'createdAt': '2017-11-01T14:18:52.937Z', 'publishedAt': '2017-11-01T14:20:59.209Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171101141835_yQYTXc_enakorin_1_11_2017_14_16_45_351.jpeg'}, {'createdAt': '2017-10-31T10:56:55.988Z', 'publishedAt': '2017-10-31T12:25:55.217Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/2017-10-31-nozomisasaki_official_31_10_2017_10_49_17_24.jpg'}, {'createdAt': '2017-10-27T11:40:43.793Z', 'publishedAt': '2017-10-27T12:02:30.376Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171027114026_v8VFwP_joanne_722_27_10_2017_11_40_17_370.jpeg'}, {'createdAt': '2017-10-25T11:30:18.697Z', 'publishedAt': '2017-10-25T11:39:10.950Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171025112955_lmesMu_katyteiko_25_10_2017_11_29_43_270.jpeg'}, {'createdAt': '2017-10-24T08:35:43.61Z', 'publishedAt': '2017-10-24T11:50:49.1Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171024083526_Hq4gO6_bluenamchu_24_10_2017_8_34_28_246.jpeg'}, {'createdAt': '2017-10-23T12:31:32.639Z', 'publishedAt': '2017-10-23T12:44:23.660Z', 'type': '美图', 'url': 'https://img.gank.io/anri.kumaki_23_10_2017_12_27_30_151.jpg'}, {'createdAt': '2017-10-18T09:14:07.966Z', 'publishedAt': '2017-10-20T10:26:24.673Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171018091347_Z81Beh_nini.nicky_18_10_2017_9_13_35_727.jpeg'}, {'createdAt': '2017-10-12T07:32:28.644Z', 'publishedAt': '2017-10-17T13:10:43.731Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171012073213_p4H630_joycechu_syc_12_10_2017_7_32_7_433.jpeg'}, {'createdAt': '2017-10-12T07:31:27.363Z', 'publishedAt': '2017-10-16T12:19:20.311Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171012073108_0y12KR_anri.kumaki_12_10_2017_7_30_58_141.jpeg'}, {'createdAt': '2017-10-11T08:49:21.485Z', 'publishedAt': '2017-10-11T12:40:42.545Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/20171011084856_0YQ0jN_joanne_722_11_10_2017_8_39_5_505.jpeg'}, {'createdAt': '2017-10-10T12:38:25.180Z', 'publishedAt': '2017-10-10T12:41:34.882Z', 'type': '美图', 'url': 'http://7xi8d6.com1.z0.glb.clouddn.com/2017-10-10-sakura.gun_10_10_2017_12_33_34_751.jpg'}]}
name:asd
age:12
score:78
name:阿萨德
age:23
score:89
# student.json 文件里面的内容为:
[{"name": "a", "age": 2, "score": 2.0}, {"name": "s", "age": 3, "score": 3.0}, {"name": "asd", "age": 12, "score": 78.0}, {"name": "\u963f\u8428\u5fb7", "age": 23, "score": 89.0}]
三、网络请求
python 中的数据请求(HTTP请求),是第三方库 requests 来提供的。
1.requests 第三方库的使用
get/post 都是发送请求,获取接口提供的数据
.get(url, params=None)
url -----需要获取的参数地址
params -----传字典,参数列表(给服务器发送请求的时候需要传给服务器的数据)
完整的接口:协议名://主机地址/路径?参数名=值1&参数名=值2
.post(url, params=None, json=None)
例如:
import requests
def main():
# 1.发送一个请求,并且获取返回的数据
# 服务器返回的数据较响应
response = requests.get('https//www.apiopen.top/meituApi?page=1')
print(response)
# 2.从响应中获取数据
# a.获取 json 数据
content_json = response.json() # 会自动将 json 数据转换成 python 对应的数据
print(type(content_json))
# b.获取字符串数据
content_json = response.text
print(type(content_json))
print(content_json)
# c.获取二进制数据(元素数据)
content_json = response.content
if __name__ == '__main__':
main()
运行结果:
四、异常
1.异常捕获:让本该报错的地方,不报错。
当知道某段代码会出现异常,而且没有办法避免同时又希望出现异常时程序不崩溃,
就可以通过异常捕获来让程序不崩溃,并且自行处理异常。
2.异常捕获的语法:
a.try——except -----可以捕获所有类型的异常
tey:
代码段1(可能会出现异常的代码段)
except:
代码段2(出现异常后处理异常的代码段)
执行过程:执行代码段1,如果代码段1中出现异常,程序不崩溃,直接执行代码段2。
如果代码段1中没有出现异常,那就不执行代码段2,而是执行后面的其它语句。
b.try - except 错误类型(捕获指定类型的异常)
只有代码段1出现了指定类型的异常才捕获。
try:
代码段1(可能会出现的代码段)
except 错误类型:
代码段2(出现异常后处理异常的代码段)
c.try - except(错误类型1, 错误类型2···)
同时捕获多种指定的异常,对不同的异常做相同处理。
try:
代码段1(可能会出现的代码段)
except (错误类型1, 错误类型2···):
代码段2(出现异常后处理异常的代码段)
d.try - except 错误类型1 - except 错误类型2···
可以对不同的异常做不同处理。
try:
代码段1(可能会出现的代码段)
except 错误类型1:
代码段2(出现异常后处理异常的代码段)
错误类型2···:
except 错误类型2:
代码段3(出现异常后处理异常的代码段)
······
3.抛出异常: -----主动让程序崩溃
raise 错误类型 -----程序执行到这句代码,就报错,抛出指定错误类型。
说明:错误类型:可以是系统提供的错误类型,也可以是自定义错误类型(要求这个 值必须是一个 Exception 的子类)
例如:
def get_num():
while True:
try:
num1 = int(input('请输入一个数字'))
print(num1)
break
except:
print('输入有误,请重新输入!')
return num1
def main():
get_num()
if __name__ == '__main__':
main()
运行结果:
请输入一个数字123k
输入有误,请重新输入!
请输入一个数字123
123