小数据存储

我们在编写代码的时候,经常会涉及到数据存储的情况,如果是爬虫得到的大数据,我们会选择使用数据库,或者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

简介

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

至于推荐使用Json的理由:

  1. Json格式是一种通用的数据类型

  2. Python内置json模块,便于操作

  3. json格式类似与python的dict

  4. json的保存与读取极为方便

  5. 学习成本低,3分钟包教包会

类型、语法说明

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

  1. json的数据为key:value,且以逗号分隔,但注意json使用双引号包裹键值对

  2. 花括号中保存为对象,而方括号保存的是数组,不论python是list还是tuple,最终都会转化为数组

  3. json由于是js引申的数据类型,所以在布尔表达式与空值上,使用与python不同,需要注意

json的方法

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

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

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

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

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

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

实例

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

data = {
"in_use": True,
"info": {
"name_cn": '清风Python',
"name_en": "BreezePython",
},
"contents": ["Python", "Java", "Linux"] }

.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'}}

.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到?

The End

OK,今天的内容就到这里,如果觉得内容对你有所帮助,欢迎点击文章右下角的“在看”。

期待你关注我的公众号清风Python,如果觉得不错,希望能动动手指转发给你身边的朋友们。

作者:清风Python

Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...的更多相关文章

  1. Python小数据池,代码块

    今日内容一些小的干货 一. id is == 二. 代码块 三. 小数据池 四. 总结 python小数据池,代码块的最详细.深入剖析   一. id is == 二. 代码块 三. 小数据池 四. ...

  2. 小学生都能学会的python(小数据池)

    小学生都能学会的python(小数据池) 1. 小数据池. 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 缓存:int, str, bool. int: 缓存范围 -5~256 ...

  3. python 小数据池,代码块, is == 深入剖析

    python小数据池,代码块的最详细.深入剖析   一. id is == 二. 代码块 三. 小数据池 四. 总结 一,id,is,== 在Python中,id是什么?id是内存地址,那就有人问了, ...

  4. python -- 小数据池 is和 == 再谈编码

    1.小数据池 python程序是由代码块构成的,一个代码块的文本作为python程序的执行单元. 代码块:一个模块,一个函数,一个类,甚至一个command命令都是一个代码块,一个文件也是一个代码块, ...

  5. python 小数据池,is and "==",decode ,encode

    一:小数据池 1.python运行中的缓存: 2.目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建过多的对象 3.python 缓存数据:缓存:int, str, bool.         ...

  6. python小数据池,代码块知识

    一.什么是代码块? 根据官网提示我们可以获知: A Python program is constructed from code blocks. A block is a piece of Pyth ...

  7. python小数据池概念以及具体范围

    =   赋值符号:        ==  比较值是否相等:   is  比较,比较的是内存地址      ID(内容) 数字,字符串的小数据池 小数据池现象产生的原因,作用: 为了节省内存空间. &l ...

  8. python小数据池,代码块的最详细、深入剖析

    代码块: Python程序是由代码块构造的.块是 一个python程序的文本,他是作为一个单元执行的. 代码块:一个模块,一个函数,一个类,一个文件等都是一个代码块. 而作为交互方式输入的每个命令都是 ...

  9. python小数据池,代码块深入剖析

    小数据池 目的:缓存我们字符串,整数,布尔值.在使用的时候不需要创建更多的对象 缓存:int,str,bool int:缓存范围-5~256 str:    1.长度小于等于1,直接缓存 2.长度大于 ...

随机推荐

  1. 1、第一个TensorFlow程序

    import tensorflow as tf import os os.environ[' #去掉警告,将警告级别提升 a = tf.constant(2) #定义一个常量 b = tf.const ...

  2. 常见Java数据结构&优缺点

      数组   优点:查询快,如果知道索引可以快速地存取   缺点:删除慢,大小固定     有序数组   优点:比无序数组查找快   缺点:删除和插入慢,大小固定   栈   优点:提供后进先出的存取 ...

  3. C语言变量名和地址的关系【转载】//基础的东西

    原文链接:http://blog.csdn.net/ssff1/archive/2009/12/13/4998787.aspx 变量名不占空间 变量:用来标识(identify)一块内存区域,这块区域 ...

  4. canvas线条实践之运动的正方形

    原理说明: 1.通过rect实现正方形的绘制: 2.save保存canvas面板的保存,restore回复保存的canvas面板到初始状态: 3.translate用于改变canvas坐标的起始位置: ...

  5. win7 安装php插件imagick

        win7 安装php插件imagick  <h2>安装步骤:</h2><h2><a name="t1"></a> ...

  6. 瞎折腾实录:构建 Armel 版本的 .NET Core 教程和资料资源

    目录 首先我要说明,我失败了~ 我把我的进度和经验放出来,希望能够帮助别人完成编译工作~ 背景:最近接手一个华为某型号的嵌入式设备,需要在上面搭建 .NET Core 环境. 设备是 Armel 架构 ...

  7. python模块——psutil

    import psutil 内存 mem = psutil.virtual_memory() print(mem) >>> svmem(total=17048064000, avai ...

  8. Linux下编写-makefile-详细教程(跟我一起写-Makefile-Markdown整理版)

    目录 概述 关于程序的编译和链接 Makefile 介绍 Makefile的规则 一个演示例子 make是怎样工作的 makefile中使用变量 让make自己主动推导 另类风格的makefile 清 ...

  9. win10 visual studio 2017环境中安装CUDA8

    从https://developer.nvidia.com/cuda-toolkit-archive下载CUDA 8 安装 从https://developer.nvidia.com/gamework ...

  10. mysql数据库如何赋予远程某个IP 访问权限

    1.授权用户root使用密码jb51从任意主机连接到mysql服务器: 代码如下: GRANT ALL PRIVILEGES ON *.* TO 'ROOT'@'%' IDENTIFIED BY 'j ...