|
|
51CTO旗下网站
|
|
移动端

Python的小数据存储,用什么格式更有逼格?

我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者excel存储。但如果只是一些小数据,或者说关联性较强且存在存储后复用的数据,我们该如何存储呢?

作者:王翔来源:清风Python|2019-11-26 09:56

 小数据存储

我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者excel存储。但如果只是一些小数据,或者说关联性较强且存在存储后复用的数据,我们该如何存储呢?

使用open保存文本

最简单、粗暴+无脑的存储方式就是保存成一个文本文档了。

使用open函数,将结果一行行的保存成文本,这里涉及的知识点只有简单的几条:

  • 文件读写模式,r 、w、a、b、+ ,掌握这几种即可。
  • 使用单独的open打开文件时,需要注意结尾时的调用close()函数关闭文档
  • 推荐使用上下文管理器的with open操作

csv文件

之所以将csv与excel分开说,首先需要扫盲下,csv属于特定格式的文本文件(使用逗号分隔),而excel是二进制文件。

csv可以直接使用文本编辑器打开,excel不行…

其实csv文件,完全可以使用open函数进行保存,只要你将每行数据都使用,分隔开即可。

另外,python自带csv库,可以很方便的操作与保存该数据

xml文件

xml文件的方式,已经逐渐被淘汰了,为什么这么说?因为它繁琐的树形结构,导致了在传输过程中,占用了更多的内存。所以,除非必要,真的不推荐以xml的形式存储你的数据…

configparser

python模块中configparser是一个专门用来保存配置文件的模块库,它非常适合保存一些具有关联性的数据内容,尤其是配置文件。通过定义section的方式,在section中添加key:value的方式,可以直观明了的数据内容。我之前专门写了一篇关于它的文章,会附在公众号的字文章中,喜欢的朋友可以去看看。

pyyaml

yaml类型的文件已经成为很多Linux下的主流配置文件类型,比如Docker、Ansible等等都在使用yaml,但它依然不是一个主流的数据存储方式,因为yaml本身的格式要求太过严苛,比结构化的Python格式更为严格,喜欢的朋友可以去研究下…

pickle

pickle模块的使用面很窄,但不得不说还是有些人会使用,所以简单说些它的优劣:

优势:接口简单(与json相似);存储格式通用型,及在Windows、Linux等平台下通用;二进制存储,效率高

劣势:pickle是python特定的协议,其他语言无法使用;pickle存在安全性,这个要着重说下,看下图

pickle安全性

Json文件

说了上面那么多,压轴的还是Json!

首先相对于xml,现在更多的网站在数据传输中使用json格式,因为同等的字节下,json传输数据的效率要更高于xml。

json与xml对比

对于configparser,configparser有一个巨大的劣势,在于配置文件只能支持二维,section下定义option(key:value),如果想在option的value中再次定义列表、字典等数据类型,它只能识别为字符串,你需要将str手动再转化为对应的数据类型

而针对ymal,json没有那么严格的格式要求,写做一行还是换行展示都随你,没有那么严苛的要求。

最后对比pickle,json格式是各种编程语言通用的数据格式,由于是key value的键值对,不存在loads之后的安全问题。而且你学会了json,也就学会了pickle,因为二者的使用方式一毛一样啊!

三分钟学会Json

1.简介

JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

至于推荐使用Json的理由:

  1. Json格式是一种通用的数据类型
  2. Python内置json模块,便于操作
  3. json格式类似于python的dict
  4. json的保存与读取极为方便
  5. 学习成本低,3分钟包教包会

2.类型、语法说明

python与json数据类型

看到上图的Python与json对比关系,其实差异并不大,我们只需要注意几点即可:

  1. json的数据为key:value,且以逗号分隔,但注意json使用双引号包裹键值对
  2. 花括号中保存为对象,而方括号保存的是数组,不论python是list还是tuple,最终都会转化为数组
  3. json由于是js引申的数据类型,所以在布尔表达式与空值上,使用与python不同,需要注意

3.json的方法

.dump():将python对象序列化到一个文件,是文本文件,相当于将序列化后的json字符写到一个文件

.load():从文件反序列表出python对象

json和pickle相同,都只有四个方法:

.dumps():将python对象编码为json的字符串

.loads():将字符串编码为一个python对象

即:带s的方法是数据类型间的转化str <--> dict,不带s的都是数据与文件的转化

4.实例说明

在演示前,我们需要先定义一个初始化数据:

  1. 1data = { 
  2. 2    "in_use"True
  3. 3    "info": { 
  4. 4        "name_cn"'清风Python'
  5. 5        "name_en""BreezePython"
  6. 6    }, 
  7. 7    "contents": ["Python""Java""Linux"
  8. 9} 

5..dumps() .loads()

  1.  1import json 
  2.  2json.dumps(data) 
  3.  3>>> '{"in_use": true, "info": {"name_cn": "\\u6e05\\u98cePython", "name_en": "BreezePython"}, "contents": ["Python", "Java", "Linux"]}' 
  4.  4这里大家看到一个问题,中文异常,此时我们需要添加参数ensure_ascii=False 
  5.  5json.dumps(data,ensure_ascii=False
  6.  6>>> '{"in_use": true, "info": {"name_cn": "清风Python", "name_en": "BreezePython"}, "contents": ["Python", "Java", "Linux"]}' 
  7.  7# 当然我们可以美观的打印它 
  8.  8json_data = json.dumps(data, sort_keys=True, indent=4, separators=(','': '),ensure_ascii=False
  9.  9print(json_data) 
  10. 10>>> { 
  11. 11    "contents": [ 
  12. 12        "Python"
  13. 13        "Java"
  14. 14        "Linux" 
  15. 15    ], 
  16. 16    "in_use"true
  17. 17    "info": { 
  18. 18        "name_cn""清风Python"
  19. 19        "name_en""BreezePython" 
  20. 20    } 
  21. 21} 
  22. 22 
  23. 23# 了解了dumps,loads就比较简单了... 
  24. 24json.loads(json_data) 
  25. 25{'contents': ['Python''Java''Linux'], 'in_use'True'info': {'name_cn''清风Python''name_en''BreezePython'}} 

6..dump() .load()

  1. 1import json 
  2.  2# 先来看看dump将数据保存至文本 
  3.  3with open('data.json''w', encoding='utf-8'as f: 
  4.  4    json.dump(data, f, indent=4) 
  5.  5    # 同理我们还可以使用dumps完成写入操作 
  6.  6    # f.write(json.dumps(data, indent=4)) 
  7.  7 
  8.  8# 保存了文本,我们在通过load读取出来 
  9.  9with open('data.json''r', encoding='utf-8'as f: 
  10. 10    data = json.load(f) 
  11. 11    # 同理我们还可以使用loads完成读取操作 
  12. 12    # data = json.loads(f.read()) 
  13. 13print(data) 
  14. 14>>> {'in_use'True'info': {'name_cn''清风Python''name_en''BreezePython'}, 'contents': ['Python''Java''Linux']} 

看到这里,你是否发现,即便不会dump和load我们一样可以使用dumps和loads替换前两者,完成读写操作。三分钟学会了json的操作,并且买一送一附带学会了pickle的操作。你是否get到?

【编辑推荐】

  1. 数据传输用上5G,存储不能停在4G
  2. 看大数据大佬手把手带你实现基于Zookeeper、Redis的分布式锁
  3. Kafka文件存储机制那些事
  4. 假如有人炸了支付宝的存储服务器...
  5. IBM全新发布ESS3000存储,为AI/大数据等新型应用赋能
【责任编辑:华轩 TEL:(010)68476606】

点赞 0
分享:
大家都在看
猜你喜欢

订阅专栏+更多

骨干网与数据中心建设案例

骨干网与数据中心建设案例

高级网工必会
共20章 | 捷哥CCIE

394人订阅学习

中间件安全防护攻略

中间件安全防护攻略

4类安全防护
共4章 | hack_man

142人订阅学习

CentOS 8 全新学习术

CentOS 8 全新学习术

CentOS 8 正式发布
共16章 | UbuntuServer

288人订阅学习

读 书 +更多

Ubuntu Linux入门到精通

本书全面介绍了Ubuntu Linux的相关知识,内容详实,论述清晰。主要内容包括Ubuntu介绍、文件系统管理、进程管理、压缩与查询系统、Shel...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊

51CTO服务号

51CTO官微