day16-对象的序列化和反序列化

对象的序列化(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()

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

Calendar序列化反序列化可以使用Java的Serializable接口来实现。具体步骤如下: 1. 实现Serializable接口 ```java public class MyCalendar implements Serializable { private Calendar calendar; public MyCalendar(Calendar calendar) { this.calendar = calendar; } public Calendar getCalendar() { return calendar; } public void setCalendar(Calendar calendar) { this.calendar = calendar; } } ``` 2. 序列化Calendar对象 ```java Calendar calendar = Calendar.getInstance(); MyCalendar myCalendar = new MyCalendar(calendar); try { FileOutputStream fileOut = new FileOutputStream("calendar.ser"); ObjectOutputStream out = new ObjectOutputStream(fileOut); out.writeObject(myCalendar); out.close(); fileOut.close(); System.out.println("Serialized data is saved in calendar.ser"); } catch (IOException i) { i.printStackTrace(); } ``` 3. 反序列化Calendar对象 ```java MyCalendar myCalendar = null; try { FileInputStream fileIn = new FileInputStream("calendar.ser"); ObjectInputStream in = new ObjectInputStream(fileIn); myCalendar = (MyCalendar) in.readObject(); in.close(); fileIn.close(); } catch (IOException i) { i.printStackTrace(); return; } catch (ClassNotFoundException c) { System.out.println("MyCalendar class not found"); c.printStackTrace(); return; } Calendar calendar = myCalendar.getCalendar(); System.out.println("Deserialized Calendar..."); System.out.println("Year: " + calendar.get(Calendar.YEAR)); System.out.println("Month: " + calendar.get(Calendar.MONTH)); System.out.println("Day: " + calendar.get(Calendar.DAY_OF_MONTH)); ``` 注意:Calendar对象中的时区信息不会被序列化反序列化,所以在反序列化后需要手动设置时区。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值