Python的小数据存储,用什么格式更有逼格?
小数据存储
我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者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存在安全性,这个要着重说下,看下图
Json文件
说了上面那么多,压轴的还是Json!
首先相对于xml,现在更多的网站在数据传输中使用json格式,因为同等的字节下,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的理由:
Json格式是一种通用的数据类型
Python内置json模块,便于操作
json格式类似于python的dict
json的保存与读取极为方便
学习成本低,3分钟包教包会
2.类型、语法说明
看到上图的Python与json对比关系,其实差异并不大,我们只需要注意几点即可:
- json的数据为key:value,且以逗号分隔,但注意json使用双引号包裹键值对
- 花括号中保存为对象,而方括号保存的是数组,不论python是list还是tuple,最终都会转化为数组
- json由于是js引申的数据类型,所以在布尔表达式与空值上,使用与python不同,需要注意
3.json的方法
- dump():将python对象序列化到一个文件,是文本文件,相当于将序列化后的json字符写到一个文件
- load():从文件反序列表出python对象
- json和pickle相同,都只有四个方法:
- dumps():将python对象编码为json的字符串
- loads():将字符串编码为一个python对象
即:带s的方法是数据类型间的转化str <--> dict,不带s的都是数据与文件的转化
4.实例说明
在演示前,我们需要先定义一个初始化数据:
data = {
"in_use": True,
"info": {
"name_cn": 'Python',
"name_en": "BreezePython",
},
"contents": ["Python", "Java", "Linux"]
}
5.dumps() .loads()
import json
json.dumps(data)
>>> '{"in_use": true, "info": {"name_cn": "\\u6e05\\u98cePython", "name_en": "BreezePython"}, "contents": ["Python", "Java", "Linux"]}'
#这里大家看到一个问题,中文异常,此时我们需要添加参数ensure_ascii=False
json.dumps(data,ensure_ascii=False)
>>> '{"in_use": true, "info": {"name_cn": "Python", "name_en": "BreezePython"}, "contents": ["Python", "Java", "Linux"]}'
# 当然我们可以美观的打印它
json_data = json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '),ensure_ascii=False)
print(json_data)
>>> {
"contents": [
"Python",
"Java",
"Linux"
],
"in_use": true,
"info": {
"name_cn": "Python",
"name_en": "BreezePython"
}
}
# 了解了dumps,loads就比较简单了...
json.loads(json_data)
{'contents': ['Python', 'Java', 'Linux'], 'in_use': True, 'info': {'name_cn': 'Python', 'name_en': 'BreezePython'}}
6.dump() .load()
import json
# 先来看看dump将数据保存至文本
with open('data.json', 'w', encoding='utf-8') as f:
json.dump(data, f, indent=4)
# 同理我们还可以使用dumps完成写入操作
# f.write(json.dumps(data, indent=4))
# 保存了文本,我们在通过load读取出来
with open('data.json', 'r', encoding='utf-8') as f:
data = json.load(f)
# 同理我们还可以使用loads完成读取操作
# data = json.loads(f.read())
print(data)
>>> {'in_use': True, 'info': {'name_cn': 'Python', 'name_en': 'BreezePython'}, 'contents': ['Python', 'Java', 'Linux']}
看到这里,你是否发现,即便不会dump和load我们一样可以使用dumps和loads替换前两者,完成读写操作。三分钟学会了json的操作,并且买一送一附带学会了pickle的操作。你是否get到?
Python的小数据存储,用什么格式更有逼格?的更多相关文章
- 利用python将excel数据解析成json格式
利用python将excel数据解析成json格式 转成json方便项目中用post请求推送数据自定义数据,也方便测试: import xlrdimport jsonimport requests d ...
- python之小数据池
代码块 Python 程序 是由代码块构造的.块是一个python程序的文本,它是作为一个执行单元的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命令都是 ...
- python中的数据存储认识
声明:本人是一个初学者,博客内容基本也是一些基础的东西,如果说的有什么问题欢迎纠正. 前言 许多人初学python之前应该也学习过其他的语言,比如博大精深的c语言,笔者在学习python之前就学习过c ...
- python基础--小数据池,代码块的最详细、深入剖析
本文转至太白金星 一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了,什么是内存地址呢? 你只要创建一个数据(对象)那么都会在内存中开辟一个空间,将这个数据临时加在到内存 ...
- 6.Python初窥门径(小数据池,集合,深浅拷贝)
Python(小数据池,集合,深浅拷贝) 一.小数据池 什么是小数据池 小数据池就是python中一种提高效率的方式,固定数据类型,使用同一个内存地址 小数据池 is和==的区别 == 判断等号俩边的 ...
- python的小数据池
一.什么是小数据池? 小数据池是一种缓存机制,也被称为驻留机制.各种编程语言中都有类似的东西(常量池.小数据池都是指得同一个内容). python自动将-5~256的整数.有一定规则的字符串.都放在一 ...
- python之json数据存储
# 数据存储:json.dump()和json.load() # date:2017-07-17 import json file_name = 'D:/json_file.txt' nums = [ ...
- python --- 06 小数据池 编码
一.小数据池, id() 进行缓存 1.小数据池针对的是: int, str, bool 2.在py文件中几乎所有的字符串都会缓存. 在cmd命令窗口中几乎都不会缓存 不同的解释器有不同 ...
- python的小数据池 is和== 以及再谈编码
---恢复内容开始--- 1. 小数据池, id() 小数据池针对的是: int, str, bool 在py文件中几乎所有的字符串都会缓存. id() 查看变量的内存地址 # a = 10 # b ...
随机推荐
- 《Java基础知识》序列化与反序列化详解
序列化的作用:为了不同jvm之间共享实例对象的一种解决方案.由java提供此机制. 序列化应用场景: 1. 分布式传递对象. 2. 网络传递对象. 3. tomcat关闭以后会把session对象序列 ...
- html5+css3的神奇搭配
1.关于浮动 浮动的元素会脱离标准文档流(float),从而不占据空间,实现了一行排列多个元素的效果 ,但是又导致上级元素height消失,处理这种情况的方法就是有两种: 1.第一种在css里写个伪类 ...
- 获取开发版sha1和开发版sha1
注:前提是你已经安装好jdk和android-sdk,并且将两者的环境变量已经设置完毕,我这里是jdk8 获取开发版sha1(也称作测试版) 1.打开命令行 cd .android 2.输入keyto ...
- 富士通 DX90 S2存储分配映射盘
屁话不多说,直接开操: 1.连接存储 用pc连接到存储管理口,如192.168.1.101 登录管理账号:默认root/root 创建Volume, 点击create开始创建新的volume 按需填写 ...
- 微信 电脑版 HOOK(WeChat PC Hook)- 框架
软件构成:一个主进程exe和一个注入的dll主进程exe:把dll注入到微信,发送指令给dll,接受dll的信息注入的dll:被注入到微信内部,拦截微信的数据,调用微信的功能 接收主进程的指令,执行指 ...
- Asp.Net MVC Webapi Eventsource 实现时效消息
ApiController 后端API public System.Net.Http.HttpResponseMessage GetUnknownNotices() { var user = Form ...
- 2019年腾讯PHP程序员面试题目分享
有需要学习交流的友人请加入交流群的咱们一起,有问题一起交流,一起进步!前提是你是学技术的.感谢阅读! 点此加入该群jq.qq.com 1. php 的垃圾回收机制 PHP 可以自动进行内存管理,清除 ...
- JavaWeb学习——了解Servlet
JavaWeb学习——了解Servlet 摘要:本文主要学习了什么是Servlet,以及如何使用Servlet进行开发. 基础知识 背景 随着互联网技术的发展,基于HTTP和HTML的web应用急速增 ...
- CF977D Divide by three, multiply by two
题目链接 我同学在旁边做者道题,我也看了一下 真的好水难 一看这道题,直接搜索 剪枝是不可能剪枝的一辈子不可能 Code #include <cstdio> #include <io ...
- Android项目实战之高仿网易云音乐项目介绍
这一节我们来讲解这个项目所用到的一些技术,以及一些实现的效果图,让大家对该项目有一个整体的认识,推荐大家收藏该文章,因为我们发布文章后会在该文章里面加入链接,这样大家找着就很方便. 目录 第1章 前期 ...