【第16天】Python第一阶段学习总结
2021/10/11
一. 练习
- 将100以内的素数输出到一个文件中
def is_prime(num: int) -> bool:
"""
判断一个正整数是不是质数
:param num: 正整数
:return: 质数返回True,否则返回False
"""
for i in range(2, int(num ** 0.5) + 1):
if num % i == 0:
return False
return True
with open('prmie.txt', 'w') as file:
for n in range(2, 100):
if is_prime(n):
file.write(f'{n}\n')
二. 对象的序列化和反序列化
1. 序列化(serialization)
- 把一个对象(字典、列表等)变成字符串(str)或者字节串(bytes-二进制数据)
2. 反序列化(deserialization)
- 从字节串或字符串中还原一个对象(字典、列表等)
3. JSON和Pickle的序列化操作
-
Python的标准库有一个json/pickle模块,可以支持我们做序列化和反序列化操作
-
Json
- JSON —> JavaScript Object Notation —> JavaScript语言创建对象的字面量语法
let person = { name: '骆昊' age: 41, sex: True }
这种数据格式也非常适合在两个系统(尤其是异构的系统)传输数据(因为它是纯文本),所以今天当我们说到JSON,更多的时候是把它当成一种数据交换格式。
-
Python中的字典跟JSON格式非常相似,所以我们可以通过将字典转成JSON格式的字符串,就可以写入文件中实现持久化。
-
JSON序列化通用,所有编程语言都可读;字符串(txt文件)
-
json.dumps/json.dump
- json.dumps(变量, file=文件名):分两步,dumps先把对象变成字符串,然后再往file里写
- content = json.dumps(变量)
- file.write(content)
- json.dump(变量,fp=文件名):将dumps的两步合为一步
import json person = { 'name': '浩宇', 'age': 25, 'sex': True, 'friends': ['赵云', '马超', '辛弃疾'], 'car': { 'brand': 'QQ', 'max_speed': 120 } } with open('person.txt', 'w') as file: # 序列化 # content = json.dumps(person) # file.write(content) # dumps先把对象变字符串 # print(json.dumps(person), file=file) json.dump(person, fp=file) # 可以指定参数
- json.dumps(变量, file=文件名):分两步,dumps先把对象变成字符串,然后再往file里写
-
Pickle序列化只有Python能读出来:字节串(dat文件)
- pickle.dumps/pickle.dump
- pickle.dumps(变量):分两步,dumps先把对象变成字节串,然后再往file里写
- content = pickle.dumps(变量, file=文件名)
- file.write(content)
- pickle.dump(变量,file=文件名):将dumps的两步合为一步
- pickle.dumps(变量):分两步,dumps先把对象变成字节串,然后再往file里写
import pickle person = { 'name': '浩宇', 'age': 25, 'sex': True, 'friends': ['赵云', '马超', '辛弃疾'], 'car': { 'brand': 'QQ', 'max_speed': 120 } } with open('person.dat', 'wb') as file: # 序列化 # file.write(pickle.dumps(person)) # dumps先把对象变字符串 # print(pickle.dumps(person), file=file) pickle.dump(person, file=file) #
- pickle.dumps/pickle.dump
4. JSON和Pickle的反序列化操作
-
JSON:读取文件中的JSON格式数据还原成字典对象
- json.load(fp=文件名)
- json.loads(变量):变量是读文件获取到的字符串
import json with open('person.txt') as file: # 反序列化:将字符串还原成(字典) # content = file.read() # obj = json.loads(content) # print(obj, type(obj)) # 从文件中读取字符串还原成字典对象 obj = json.load(fp=file) print(obj) print(type(obj))
-
Pickle
- pickle.load(文件名)
- pickle.loads(变量):变量是读文件获取到的字节串
import pickle with open('person.dat', 'rb') as file: # 反序列化:将字符串(或字节串)还原成(字典) # content = file.read() # obj = pickle.loads(content) # print(obj, type(obj)) obj = pickle.load(file) print(obj) print(type(obj))
三. 联网获取数据
1. URL
- URL —> 网址 —> 统一资源定位符 —> 能够唯一标识一个(网络)资源的符号
协议://用户名:口令@域名或者IP地址端:端口/路径1/路径2/资源名称
https://www.baidu.com:443/index.html
https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png
- URI —> 统一资源标识符 —> URL + URN
- 协议 —> 规范和标准 —> 网络协议 —> 通过网站进行通信的双方要遵守的规范和标准
- HTTP(S) —> 超文本传输协议(S:安全环境) —> 请求响应式协议
2. 三方库
- 可以使用Python的包管理工具 pip 来安装和管理三方库以及三方工具
- 修改 pip 下载源为国内的镜像网站(推荐使用豆瓣网的镜像)
pip config set global.index-url https://pypi.doubanio.com/simple - 查找三方库:pip serach requests
安装三方库:pip install requests
卸载三方库:pip uninstall requests
更新三方库:pip install -U requests
3. 三方库requests的使用
-
使用三方库 requests 可以非常方便的实现通过URL访问网络资源的操作
-
requests.get(url=‘网址’, params={参数1、参数2、…}):get函数会通过你指定的URL向web服务器发起一个请求,该指数会返回一个响应对象
-
响应对象.json():url请求返回的是一个json文件,用.json转换成字典
-
json.loads(响应对象**.text**):字符串文件转回成字典
import json import requests # 获取天气预报 resp = requests.get( url='http://apis.juhe.cn/simpleWeather/query', params={ 'city': '成都', 'key': 'eddaf86c59386a945bcff5b4bc49e739' } ) weather_dict = json.loads(resp.text) print(weather_dict['result']['realtime']) futures = weather_dict['result']['future']
# 获取手机号归属地 cell_info = requests.get( url='http://apis.juhe.cn/mobile/get', params={ 'phone': '15877902802', 'key': '9413c4d1f3254dc3dbac4def8d81933c' } ) cell_dict = json.loads(cell_info.text) # 字符串文件转回成字典 print(cell_dict['result']) print(cell_dict['result']['province'], cell_dict['result']['city'])
四. Excel文件操作
- import openpyxl
- 创建一个Excel工作簿:workbook = openpyxl.Workbook()
- 获取默认的工作表:sheet = workbook.active
- 添加表头:sheet.append(列表、元组、字典等)
- 保存工作簿:workbook.save(‘文件名.xlsx’)
import openpyxl
# 创建一个Excel工作簿
workbook = openpyxl.Workbook()
# 获取默认的工作表
sheet = workbook.active
# 添加表头
sheet.append(('姓名', '语文', '数学', '英语'))
sheet.append(('骆昊', '50', '60', '70'))
sheet.append(('王大锤', '85', '96', '70'))
sheet.append(('浩宇', '100', '100', '100'))
sheet.cell(5, 1, '张三') # 第5行第1列
# 保存工作簿
workbook.save('学生考试成绩.xlsx')
from datetime import datetime
import requests
import json
import openpyxl
# 每天从头条新闻获取100条新闻,并创建一个Excel表保存数据
workbook = openpyxl.Workbook()
sheet = workbook.active
sheet.append(('title', 'url', 'source'))
for page in range(1, 6):
resp = requests.get(
url='https://api.tianapi.com/topnews/index',
params={
'key': 'e8c5524dd2a365f20908ced735f8e480',
'page': page,
'num': 20
}
)
result = resp.json() # url请求返回的是一个json文件,用.json转换成字典
# print(result)
for news_dict in result['newslist']:
sheet.append((news_dict['title'], news_dict['url'], news_dict['source']))
current = datetime.now()
workbook.save(f'新闻_{current.year}{current.month:0>2d}{current.day:0>2d}.xlsx')