对象的序列化(serialization)和反序列化(deserialization)
序列化:把一个对象(字典、列表等)变成字符串(str)或者字节串(bytes)
反序列化:从字节串或字符串中还原一个对象(字典、列表等)
Python标准库中有名为json
/pickle
的模块,可以支持我们做序列化和反序列化操作
JSON
—> JavaScript Object Notation
—> JavaScript
创建对象的字面量语法
let person = {
name: 'ljb',
age: 21,
sex: True
}
这种数据格式也非常适合在两个系统(尤其是异构的系统)之间传输数据(因为它是纯文本)
所以今天当我们说到JSON
,更多的时候是把它当成一种数据交换格式
Python中的字典和JSON
格式非常的像,所以我们可以通过将字典转成JSON
字符串,就可以写入文件中实现持久化
import json
person = {
'name': 'ljb',
'age': 21,
'sex': True,
'friend': ['赵云', '马超', '辛弃疾'],
'car': {
'brand': 'QQ',
'max_speed': 120
}
}
with open('person.txt', 'w') as file:
# 序列化
json.dump(person, fp=file)
import pickle
person = {
'name': 'ljb',
'age': 21,
'sex': True,
'friend': ['赵云', '马超', '辛弃疾'],
'car': {
'brand': 'QQ',
'max_speed': 120
}
}
with open('person.dat', 'wb') as file:
# 序列化
pickle.dump(person, file=file)
反序列化
import json
with open('person.txt') as file:
# 反序列化
obj = json.load(fp=file)
print(obj) # {'name': 'ljb', 'age': 21, 'sex': True, 'friends': ['赵云', '马超', '辛弃疾'], 'car': {'brand': 'QQ', 'max_speed': 120}}
print(type(obj)) # <class 'dict'>
import pickle
with open('person.dat', 'rb') as file:
# 反序列化:将字节串还原成(字典)对象
obj = pickle.load(file=file)
print(obj) # {'name': 'ljb', 'age': 21, 'sex': True, 'friends': ['赵云', '马超', '辛弃疾'], 'car': {'brand': 'QQ', 'max_speed': 120}}
print(type(obj)) # <class 'dict'>
联网获取数据
URL —> 网址 —> 统一资源定位符 —> 能够唯一标识一个(网络)资源的符号
协议://用户名:口令@域名或者IP地址:端口/路径1/路径2/资源名称
使用三方库requests
可以非常方便的实现通过URL访问网络资源的操作
可以使用Python的包管理工具pip
来安装和管理三方库以及三方工具
修改pip
下载源为国内的镜像网站(推荐使用豆瓣网的镜像)
pip config set global.index-url https://pypi.doubanio.com/simple
查找三方库:
pip search requests
安装三方库:
pip install requests
卸载三方库:
pip uninstall requests
更新三方库:
pip install -U requests
协议 —> 网络协议 —> 通过网络进行通信的双方要遵守的规范和标准
HTTP(S) —> 超文本协议 —> 请求响应式协议
get函数会通过你指定的URL向Web服务器发起一个请求,该函数会返回一个响应对象
resp = requests.get(
url='http://apis.juhe.cn/simpleWeather/query',
params={
'city': '北京',
'key': 'e73ebce8dc3cb2f35510f4462f08430c'
}
)
weather_dict = json.loads(resp.text)
print(weather_dict['result']['realtime'])
futures = weather_dict['result']['future']
for future in futures:
print(future)
通过天行数据的API接口获取头条新闻数据
from datetime import datetime
import openpyxl
import requests
newsbook = openpyxl.Workbook()
sheet = newsbook.active
for page in range(1, 6):
resp = requests.get(
url='http://api.tianapi.com/topnews/index',
params={
'key': 'e8c5524dd2a365f20908ced735f8e480',
'num': 20,
'page': page
}
)
result = resp.json()
for new_dict in result['newlist']:
print(new_dict['title'])
print(new_dict['url'])
print(new_dict['scource'])
print('-' * 50)
将获取到的题目、链接和来源写入Excel中
sheet.append(('题目', '链接', '来源'))
title, url, source = news_dict['title'], news_dict['url'], news_dict['source']
sheet.append((title, url, source))
current = datetime.now()
newsbook.save(f'头条新闻数据_{current.year}{current.month:0>2}{current.day:0>2}.xlsx)
# 创建一个Excel工作簿
workbook = openpyxl.Workbook()
# 获取默认的工作表
sheet = workbook.active
# 添加表头
sheet.append(('姓名', '语文', '数学', '英语'))
sheet.append(('李四', '82', '80', '80'))
sheet.append(('王大锤', '42', '44', '45'))
sheet.append(('李元芳', '56', '86', '76'))
# 在指定位置添加数据
sheet.cell(5, 1, '张三')
# 保存工作簿
workbook.save('学生考试成绩表.xlsx')
csv文件的读写
import csv
import random
with open('scores.csv', 'w') as file:
# writer = csv.writer(file)
writer = csv.writer(file, delimiter='|', quoting=csv.QUOTE_ALL)
writer.writerow(['姓名', '语文', '数学', '英语'])
names = ['张三', '李四', '王五', '张飞', '黄忠']
for name in names:
scores = [random.randrange(50, 101) for _ in range(3)]
scores.insert(0, name)
writer.writerow(scores)
with open('scores.csv', 'r') as file:
reader = csv.reader(file)
for data_list in reader:
print(reader.line_num, end='\t')
for elem in dara_list:
print(elem, end='\t')
print()
Excel操作
import datetime
import openpyxl
# 加载一个工作簿 ---> Workbook
wb = openpyxl.load_workbook('2020年销售数据.xlsx')
# 获取工作表的名字
print(wb.sheetnames)
# 获取工作表 ---> Worksheet
sheet = wb.worksheets[0]
# 获得单元范围
print(sheet.dimensions)
# 获得行数和列数
print(sheet.max_row, sheet.max_column)
# 获取指定单元格的值
print(sheet.cell(3, 3).value)
print(sheet['C3'].value)
print(sheet['G255'].value)
# 获取多个单元格(嵌套元组)
for row_ch in range(2, sheet.max_row+1):
for col_ch in 'ABCDEFG':
value = sheet[f'{col_ch}{row_ch}'].value
if type(value) == datetime.datetime:
print(value.strftime('%Y年%m月%d日'), end='\t')
elif type(value) == int:
print(f'{value:0<10d}', end='\t')
elif type(value) == float:
print(f'{value:.4f}', end='\t')
else:
print(value, end='\t')
print()