python读取序列5之后的数据_Python 基本功: 5. 数据序列化
这篇文章紧接着前篇:多多教Python:Python 基本功: 4. 读写文件zhuanlan.zhihu.com
仔细阅读的小伙伴会发现,在基本功4 里最后的一个示例中,我们读取解析了文件中的内容,并且把其中的日期,价格金融数据存入了 Python 字典当中:
In[4] abc_dict
Out[4]:{datetime.datetime(2019, 7, 18, 0, 0): 9682.24,
datetime.datetime(2019, 7, 17, 0, 0): 9411.61,
datetime.datetime(2019, 7, 16, 0, 0): 10858.7,
datetime.datetime(2019, 7, 15, 0, 0): 10195.0,
datetime.datetime(2019, 7, 14, 0, 0): 11378.23,
datetime.datetime(2019, 7, 13, 0, 0): 11810.0,
datetime.datetime(2019, 7, 12, 0, 0): 11338.9,
datetime.datetime(2019, 7, 11, 0, 0): 12090.99,
datetime.datetime(2019, 7, 10, 0, 0): 12577.85}
我们知道了如何从文章读取数据,解析,保存 (原数据),但是我们该如何保存 abc_dict 这个字典呢?这篇文章通过对数据的序列化,和其更高层次的应用,来了解我们如何正确的对 Python 数据类做存储。
教程需求:Mac OS (Windows, Linux 会略有不同)
安装了 Python 3.0 版本以上, Anaconda
数据序列化
首先我们来了解一下什么是数据序列化。序列化 (Serialization),是指把程序中的一个类转化成一个标准化的格式。标准化的意义是这个格式可以跨程序,跨平台的被使用,而且保持其原有的内容,规范。
首先我们举个例子,在不用数据序列化的方法,而是直接把字典 abc_dict 存入文件,则是下面的情况:
In [1]:save_file = "abc_dict.txt"
In [2]:with open(save_file, 'w') as file_to_write:
file_to_write.write(str(abc_dict))创建一个变量,定义要存入文件名称。
首先把字典转化成 Python 基础字符串,因为字典本身不能直接被写入文件,然后再把字符串写入文件中。
运行之后,我们会在本地找到一个新的文件,如果你打开的话就是这样:abc_dict.txt
我们来专业的分析一下这么做的几个问题:一致性:保存在文件的是一个字符串,当你再次读取的时候,你需要再次做文件解析,并且没有任何保证解析出来的和保存的内容是一样的。
有效性:数据非常冗长,原本日期 7/18/2019 变成了 datetime.datetime(2019, 7, 18, 0, 0) 这么一个字符串。在跨平台使用时,占用了过多的内存和网络资源。
兼容性:文件是 .txt 格式,没有一个标准来定义该如何读取里面的内容。虽然在写入的时候是 Python 字典转化的,但是读取的程序如果不是 Python,或者不存入字典,就会出现 兼容性问题。
保持数据传输的 一致性,有效性,兼容性 就是数据序列化的意义,下面介绍在数据流 (Data Flow)中,两个数据序列化的应用:你的程序需要和其他程序交流,例如 平台 API, 网页请求串行任务流,每一个任务结束之后数据通过序列化传递到下一个任务。
JSON 序列化
这里我们来介绍第一个序列化方式:JSON。JSON 是一个文件格式,也是一个标准化的数据传输方案,通常网站的后端和前段的交流,移动 APP 和云服务器的交流方式都是通过 JSON。所以我们先来看这个比较通用流行的方法:
In [1]:import json
In [2]:simple_dict = {'ticker': 'baba', 'price': '120.5'}
In [3]:with open('simple_dict.txt', 'w') as file_to_write:
json.dump(simple_dict, file_to_write)第一行调用了 Json 模块 (模块是较小的库,可以理解为子库),Json 不是一个 Python 自带的基本类型,所以需要调用,但是默认都已经装好了。
创建一个简单字典。
用同样的方法 With 语境,创建一个 simple_dict.txt 文件来保存数据,然后通过调用 json.dump() 方法,把字典转化成 Json 格式的字符串,然后写进文件。
现在我们打开 simple_dict.txt 的文件,就可以看到里面的数据是通过 Json 格式保存。你可以建立一个更加复杂的字典来更加明了的发现 Json 格式转化后的区别:
In [1]: complex_dict = {'ticker': ['baba', 'pdd'], 'price': {'open': 120, 'close': 123, 'vwap': 122}}
然后用同样的方法保存,打开保存的文件,复制里面的内容,然后进入:Json Parser Onlinejson.parser.online.fr
一个 Json 在线解析网站,黏贴 Json 内容,就会发现解析过后的字符串显示的非常清晰。
从 Python 中读取我们保存下来的 simple_dict 很简单,只需要一行代码:
In [1]:with open('simple_dict.txt', 'r') as file_to_read:
loaded_simple_dict = json.load(file_to_read)
print(type(loaded_simple_dict))
Out [1]: json.load() 是直接从文件中读取全部字符串,然后转化成 Json 理解的格式,然后传给变量 loaded simple dict。看了一下这个变量,的确是字典类。
那 Json 方法有什么弊端呢?尝试把之前创建的 abc_dict 这个字典用同样的方法保存进文件中,你们会发现 Python 会报错:
这个错是因为 abc_dict 字典里的 钥匙是 Python 的 Datetime 数据类,而 Json 的标准化里面并没有 Python 的 Datetime 规则,也就是说当遇到一些 Python 特定的高级数据类型的时候,Json 会因为没有标准而无法进行序列化,而接下来介绍的这个工具会解决这个问题。
Pickle 序列化
Pickle 和 Json 不同的是,Pickle 是 Python 专属的序列化方案,可以转化大多数 Python 的数据类型,并且储存方式是二进制(Byte Code)。二进制的储存方式只有机器才能理解,但是同时也保证了一定的数据隐秘性和高效性。
下面我们来看如何用 Pickle 来实现数据序列化:
In [1]:import pickle
In [2]:with open('abc.pk', 'wb') as file_to_write:
pickle.dump(abc_dict, file_to_write)
In [3]:with open('abc.pk', 'rb') as file_to_read:
abc_dict_pk = pickle.load(file_to_read)
print(type(abc_dict_pk))
Out [3]:调用 Pickle 模块。
这里打开文件的方式是 'wb', 因为 pickle 写入的是二进制格式,如果不加上 'b' 的话会导致无法写入文件。
写入文件之后,再用 pickle 读出数据,同样的因为读取的是二进制,我们用了 'rb' 模式。然后我们检查返回的数据是否是字典类。
我们会发现 Pickle 的语法和 Json 非常相似,虽然本身两者对数据序列化的处理方式皆然不同,但是得益于 Python 的高级接口抽象(Interface Abstraction),记得 鸭子类型:
我们并不关心对象是什么类型,到底是不是鸭子,只关心行为。
这里两个方法的行为都是在序列化数据,所以在调用方程上感觉完全一样。但是本质上 Json 写入文件的是字符串,而 Pickle 则是把数据转化成了二进制,两个是完全不同的处理方案。
小结
现在流行的数据序列化方案还有 Protobuf, 一个谷歌开发的快速轻量级方案:protocolbuffers/protobufgithub.com
另一个是结合了Json 和 二进制优势的 Bson:BSON (Binary JSON) Serializationbsonspec.org
在一个大数据任务当中,通常需要多任务并行和串行结合运算加快速度。为了防止中间一环失败而导致整个任务重启,往往会在中间步骤把数据保存下来,就像下图:Map Reduce 利用 Transient Data (临时数据) 来做进度保存
在之后的课程中,Json 和 Pickle 都会频繁的用到的领域有:大数据处理,消费者数据流。
高并发的科学计算。
建立一个神经网络。
python读取序列5之后的数据_Python 基本功: 5. 数据序列化相关推荐
- python处理表格数据-python读取word 中指定位置的表格及表格数据
1.Word文档如下: 2.代码 # -*- coding: UTF-8 -*- from docx import Document def readSpecTable(filename, specT ...
- python怎么读文件里的某一行-python读取txt文件并取其某一列数据的示例
菜鸟笔记 首先读取的txt文件如下: AAAAF110 0003E818 0003E1FC 0003E770 0003FFFC 90 AAAAF110 0003E824 0003E208 0003E7 ...
- python读取指定路径txt文件-python读取txt文件并取其某一列数据的示例
菜鸟笔记 首先读取的txt文件如下: AAAAF110 0003E818 0003E1FC 0003E770 0003FFFC 90 AAAAF110 0003E824 0003E208 0003E7 ...
- python 读取excel文件 效率 时间 格式_python读取Excel文件中的时间数据
在使用python读取Excel文件中的时间格式,碰到的时间格式转换问题: 读取这样的表格: 输出这样的数据结果: 然而这样的结果却不是我们想要的,我们需要的是这样的结果: 1.安装python官方库 ...
- python读取文件按行分割字符串_python在TXT文件中按照某一字符串取出该字符串所在的行方法...
python在TXT文件中按照某一字符串取出该字符串所在的行方法 主要流程:读取文件数据--将每一行数据分成不同的字符段--在判断 在某个字否段是否含与某个字符.(只是其中一种办法) 代码如下: wi ...
- python读取邮件发送日期和时间_Python读取指定日期邮件的实例
背景:9月份有部分数据缺失,这部分数据在邮箱里,需要重新拉取,但是每天几百封邮件,总共有6.7万封邮件,使用stat()和retr(which)结合遍历很 耗时 基于如上背景,初始大致思路为: 使用二 ...
- python读取mysql以html形式输出_python实现处理mysql结果输出方式
在运维过程中,经常需要读取mysql的结果输出并进行响应的处理,这节介绍如何用Python读取mysql结果表并进行相应的整理. 进行mysql结果文件输出: mysql -h10.20.10.207 ...
- python读取视频占用内存太大_Python 读取大文件内存占用检测示例
导读热词对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录 ...
- python读取大文件的某行_python 大文件以行为单位读取方式比对
先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. 该文章实际上提供了集中读取大文件的方式,先经过测试总结如下 1. for l ...
最新文章
- 如何使用python画折线图-python使用matplotlib绘制折线图教程
- linux系统调用理解之摘录(1)
- Java进阶:volatile使用详解
- Go netpoller 网络模型之源码全面解析
- 基于 registry 搭建 Docker 私有镜像仓库
- Tomcat关闭失败,SEVERE: Could not contact localhost:8005. Tomcat may not be running.
- 移动对meta的定义(转)
- 用计算机探索奥秘规律例题,人教新课标小学五年级上册数学《用计算器探索规律》教案...
- 为什么在JavaScript中0.1+0.2不等于0.3?
- ELK下es索引管理工具-curator
- 2020 计蒜之道 预赛 第一场 爆零记
- VC中Radio控件的用法
- win7一直显示正在关机_当办公场所没有WIFI,有网线,笔记本如何在 win7建立无线网络...
- TSL237 简介
- PeopleSoft技术(Application Designer学习,简称AD)
- 使用React.js和appbase.io构建类似Twitter的Search Feed
- 【机器学习实战笔记】Logistic回归
- 华硕路由搭建php网站,华硕路由器操作模式
- Linux [11] -- Recap Linux Basic Command
- 计算机盖,盖珂珂_北京理工大学计算机学院
热门文章
- 一些比较有用的SQL操作,2011最新整理
- 【飞秋】ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码
- 苹果零售店每平方英尺能创造4000美元
- Python有多火,来看一份24小时榜单,从入门到进阶,赶紧收藏!
- 第二波 编程资料免费领,前后端、移动端都有
- 第四节:教你如何快速让浏览器兼容ES6特性
- 虚拟邮箱怎么设置方法_腾讯企业邮箱邮件列表白名单设置方法
- pytorch分布式训练(二):torch.nn.parallel.DistributedDataParallel
- 拉丁超立方抽样matlab代码_想要数据分析更快?超良心的笔记本/台式电脑配置推荐!...
- linux重启网络服务_vm上linux虚拟机NAT模式配置