这篇文章紧接着前篇:多多教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 Online​json.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/protobuf​github.com

另一个是结合了Json 和 二进制优势的 Bson:BSON (Binary JSON) Serialization​bsonspec.org

在一个大数据任务当中,通常需要多任务并行和串行结合运算加快速度。为了防止中间一环失败而导致整个任务重启,往往会在中间步骤把数据保存下来,就像下图:Map Reduce 利用 Transient Data (临时数据) 来做进度保存

在之后的课程中,Json 和 Pickle 都会频繁的用到的领域有:大数据处理,消费者数据流。

高并发的科学计算。

建立一个神经网络。

python读取序列5之后的数据_Python 基本功: 5. 数据序列化相关推荐

  1. python处理表格数据-python读取word 中指定位置的表格及表格数据

    1.Word文档如下: 2.代码 # -*- coding: UTF-8 -*- from docx import Document def readSpecTable(filename, specT ...

  2. python怎么读文件里的某一行-python读取txt文件并取其某一列数据的示例

    菜鸟笔记 首先读取的txt文件如下: AAAAF110 0003E818 0003E1FC 0003E770 0003FFFC 90 AAAAF110 0003E824 0003E208 0003E7 ...

  3. python读取指定路径txt文件-python读取txt文件并取其某一列数据的示例

    菜鸟笔记 首先读取的txt文件如下: AAAAF110 0003E818 0003E1FC 0003E770 0003FFFC 90 AAAAF110 0003E824 0003E208 0003E7 ...

  4. python 读取excel文件 效率 时间 格式_python读取Excel文件中的时间数据

    在使用python读取Excel文件中的时间格式,碰到的时间格式转换问题: 读取这样的表格: 输出这样的数据结果: 然而这样的结果却不是我们想要的,我们需要的是这样的结果: 1.安装python官方库 ...

  5. python读取文件按行分割字符串_python在TXT文件中按照某一字符串取出该字符串所在的行方法...

    python在TXT文件中按照某一字符串取出该字符串所在的行方法 主要流程:读取文件数据--将每一行数据分成不同的字符段--在判断 在某个字否段是否含与某个字符.(只是其中一种办法) 代码如下: wi ...

  6. python读取邮件发送日期和时间_Python读取指定日期邮件的实例

    背景:9月份有部分数据缺失,这部分数据在邮箱里,需要重新拉取,但是每天几百封邮件,总共有6.7万封邮件,使用stat()和retr(which)结合遍历很 耗时 基于如上背景,初始大致思路为: 使用二 ...

  7. python读取mysql以html形式输出_python实现处理mysql结果输出方式

    在运维过程中,经常需要读取mysql的结果输出并进行响应的处理,这节介绍如何用Python读取mysql结果表并进行相应的整理. 进行mysql结果文件输出: mysql -h10.20.10.207 ...

  8. python读取视频占用内存太大_Python 读取大文件内存占用检测示例

    导读热词对python这个高级语言感兴趣的小伙伴,下面一起跟随编程之家 jb51.cc的小编两巴掌来看看吧! python读写文件的api都很简单,一不留神就容易踩"坑".笔者记录 ...

  9. python读取大文件的某行_python 大文件以行为单位读取方式比对

    先前需要做一个使用python读取大文件(大于1G),并逐条存入内存进行处理的工作.做了很多的尝试,最终看到了如下的文章. 该文章实际上提供了集中读取大文件的方式,先经过测试总结如下 1. for l ...

最新文章

  1. 如何使用python画折线图-python使用matplotlib绘制折线图教程
  2. linux系统调用理解之摘录(1)
  3. Java进阶:volatile使用详解
  4. Go netpoller 网络模型之源码全面解析
  5. 基于 registry 搭建 Docker 私有镜像仓库
  6. Tomcat关闭失败,SEVERE: Could not contact localhost:8005. Tomcat may not be running.
  7. 移动对meta的定义(转)
  8. 用计算机探索奥秘规律例题,人教新课标小学五年级上册数学《用计算器探索规律》教案...
  9. 为什么在JavaScript中0.1+0.2不等于0.3?
  10. ELK下es索引管理工具-curator
  11. 2020 计蒜之道 预赛 第一场 爆零记
  12. VC中Radio控件的用法
  13. win7一直显示正在关机_当办公场所没有WIFI,有网线,笔记本如何在 win7建立无线网络...
  14. TSL237 简介
  15. PeopleSoft技术(Application Designer学习,简称AD)
  16. 使用React.js和appbase.io构建类似Twitter的Search Feed
  17. 【机器学习实战笔记】Logistic回归
  18. 华硕路由搭建php网站,华硕路由器操作模式
  19. Linux [11] -- Recap Linux Basic Command
  20. 计算机盖,盖珂珂_北京理工大学计算机学院

热门文章

  1. 一些比较有用的SQL操作,2011最新整理
  2. 【飞秋】ASP.NET 之 常用类、方法的超级总结,并包含动态的EXCEL导入导出功能,奉上类库源码
  3. 苹果零售店每平方英尺能创造4000美元
  4. Python有多火,来看一份24小时榜单,从入门到进阶,赶紧收藏!
  5. 第二波 编程资料免费领,前后端、移动端都有
  6. 第四节:教你如何快速让浏览器兼容ES6特性
  7. 虚拟邮箱怎么设置方法_腾讯企业邮箱邮件列表白名单设置方法
  8. pytorch分布式训练(二):torch.nn.parallel.DistributedDataParallel
  9. 拉丁超立方抽样matlab代码_想要数据分析更快?超良心的笔记本/台式电脑配置推荐!...
  10. linux重启网络服务_vm上linux虚拟机NAT模式配置