数据存储

文件打开方式:
    r	 以只读方式打开文件。文件的指针将会放在文件的开头。这是默认模式。
    w	 打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a	 打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    rb	 以二进制格式打开一个文件用于只读。文件指针将会放在文件的开头。这是默认模式。
    wb	 以二进制格式打开一个文件只用于写入。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    ab	 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。也就是说,新的内容将会被写入到已有内容之后。如果该文件不存在,创建新文件进行写入。
    r+	 打开一个文件用于读写。文件指针将会放在文件的开头。
    w+	 打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    a+	 打开一个文件用于读写。如果该文件已存在,文件指针将会放在文件的结尾。文件打开时会是追加模式。如果该文件不存在,创建新文件用于读写。
    rb+	 以二进制格式打开一个文件用于读写。文件指针将会放在文件的开头。
    wb+	 以二进制格式打开一个文件用于读写。如果该文件已存在则将其覆盖。如果该文件不存在,创建新文件。
    ab+	 以二进制格式打开一个文件用于追加。如果该文件已存在,文件指针将会放在文件的结尾。如果该文件不存在,创建新文件用于读写。


用解析器解析出数据后,接下来就是存储数据了。
最简单的形式是直接保存为文本文件,如TXT、JSON、CSV等,还可以保存到数据库中,如关系型数据库MySql、非关系型数据库MongoDB、Redis等


========================================================================================================================

TXT文本存储
JSON文本存储
CSV文本存储
关系型数据库MySql
非关系型数据库MongoDB
非关系型数据库Redis


Txt文本存储:
优点:操作简单、兼容任何平台
缺点: 不利于检索

========================================================================================================================



JSON文件存储:   JavaScript对象标记,通过对象和数组的结合来表示数据
优点: 构造简洁
缺点: 构造化程度非常高
是一种轻量级的数据交换格式

1 对象和数组
在JavaScript语言中,一切都是对象,因此任何支持的类型都可以通过JSON表示,例如字符串、数字、对象、数组等,但是对象和数组是比较特殊日常用的两种类型

·对象 :它在JavaScript中是使用花括号{}包裹起来的,数据结构为{key1:value1,key2:value2,...}的键值对结构。在面向对象的语言中,key为对象的属性
value为对象的值。键名可以使用证书和字符串来表示。值的类型可以是任意类型

·数组 :数组在JavaScript中是方括号[]包裹起来的内容,数据结构为["Java","JavaScript","vb",...]的索引结构,在JavaScript中,数组是一种比较
特殊的数据类型,它也可以像对象那样使用键值对,但还是索引用的多,同样值的类型可以是任意类型

所以,一个JSON对象可以写成如下格式:
str = [{
          "name":"hotz",
          "old":"20",
          "sex":"boy"
      },{
    "name":"Carrey",
    "old":"19",
    "sex":"20"}]

由中括号包围的就相当于列表类型,列表中每个元素可以是任意类型,以上它是字典类型
JSON可以由以上两种形式自由组合而成,可以无限次嵌套,结构清晰。是数据交换的极佳方式

注意: JSON的数据需要双引号来包围,不能使用单引号,因为如果使用就会报错。。。 报错提示:因为数据用单引号包围,千万注意JSON字符串的表示符需要用
双引号,否则loads()方法会解析失败


========================================================================================================================

CSV文件存储:
CSV(逗号分隔值文件格式)
优点:比Excel文件更加简洁、结构简单清晰、保存数据方便


CSV文件写入
CSV文件读取

========================================================================================================================

关系型数据库存储:
关系型数据库时基于关系模型的数据库,而关系模型是通过二维表来保存的,所以它的存储方式就是行列组成的表。每一列是一个字段,每一行是一条记录
表可以看做某个实体的集合,而实体之间存在联系。这就需要表与表之间的关联关系来体现,如主键外键的关联关系。多个表组成一个数据库,也就是关系型数据库
关系型数据库有很多中如: SQLine、MySQL、Oracle、SQL SERVER、DB2等

1.准备工作: 安装好mysql数据库,并且能让它运行。 安装pymysql

端口号是3306,而不是'3306' ,否则会报错: self.host_info = "socket %s:%d" % (self.host, self.port) TypeError: %d format: a number is required, not str



事务(ACID)的4个属性:
1. 原子性
2. 一致性
3. 隔离性
4. 持久性



插入数据: 插入方法无需改动,做成一个通用的方法,只需要传入一个动态变化的字典就好了 :
data = {
    'xxx':'xxx',
    'xxxx':'xxxx'
}



去重方式:如果数据存在则更新数据,如果数据不存在则插入数据。 (并不是重复的再把元数据保存一遍)


mysql -u root -p  连接数据库
show databases; 查看数据库
use spiders; 使用spiders表
desc spiders; # 查看spiders表里面的信息

========================================================================================================================

非关系型数据库存储:
NoSQL是基于键值对的,而且不需要经过SQL层的解析,数据之间没有耦合性,性能非常高
更详细的用法可以在MongoDB官方文档上找到:https://docs.mongodb.com/manual/reference/operator/query/
关于PyMongo的详细用法,可以参考官方文档:http://api.mongodb.com/python/current/api/pymongo/collection.html


非关系型数据库可分如下:
1.  键值存储数据库--- 代表有Redis,Voldemort和Oracle BDB等
2.  列存储数据库--- 代表有Cassandra、HBase 和 Riak等
3.  文档型数据库--- 代表有CouchDB 和 MongoDB等
4.  图形数据库--- 代表有Neo4J、infoGrid 和 Infinite Graph等




数据之间的嵌套关系对比:
关系型数据库---不方便 :
1. 需要提前创建表
2. 需要进行序列化操作才可以存储

非关系型数据库---避免上述这些麻烦,更简单方便



MongoDB 和 Redis 的数据存储操作介绍:
MongoDB: 由C++语言编写的非关系型数据库,是一个基于分布式文件存储的开源数据库系统。内容存储形式类似JSON对象。
它的字段值可以包含其他文档、数组及文档数组,非常灵活。


准备:
1. 安装MongoDB 并启动服务
2. 安装好Python的PyMongo库

打开服务看一下MongoDB是否正在运行,如果运行就说明安装成功了



连接MongoDB:
需要使用PyMongo库里面的MongoClient,一般来说,传入MongoDB的IP及端口就好。
其中第一个参数为地址host,第二个参数为端口port (如果不传递端口参数,默认端口是27017)
import pymongo
client = pymongo.MongoClient(host='localhost',port=27107)


另外,MonClient的一个参数host还可以直接传入MongoDB的连接字符串,它以mongodb开头:
import pymongo
client = pymongo.MongoClient('mongodb://localhost:27017/')


MongoDB的每个数据库包含许多集合(collection),它们类似于关系型数据库中的表


比较符号:
符号              含义              示例
$lt             小于              {'age':{'$lt':'20'}}
$gt             大于              {'age':{'$gt':'20'}}
$lte            小于等于            {'age':{'$lte':'20'}}
$gte            大于等于            {'age':{'$gte':'20'}}
$ne             不等于             {'age':{'$ne':'20'}}
$in             在范围内            {'age':{'$in':'20'}}
%nin            不再范围内           {'age':{'$nin':'20'}}



功能符号:
符号             含义                       示例                                                  示例含义
$regex          匹配正则表达式             {'name':{'$regex':'^H.*'}}                              name以H开头
$exists         属性是否存在              {'name':{'$exists':'True'}}                              name属性存在
$type           类型判断                  {'age':{'$type':'int'}}                                 age的类型为int
$mod            数字模操作               {'age':{'$mod':[5,0]}}                                    年龄模5余0
$text           文本查询                {'$text':{'$search':'Mike'}}                              text类型的属性包含Mike字符串
$where          高级条件查询            {'where':'obj,fans_count == obj.follows_count'}            自身粉丝数等于关注数

==========================================================================================================================
Redis存储:
Redis是一个基于内存的高效的键值型非关系型数据库,存取效率极高,而且支持多种存储数据结构,使用简单。


Redis优势:
1. 读写速度快
2. 丰富的数据类型
3. 原子性
4. 丰富的特性



准备工作:
安装Redis 和 redis.py库,如果要做数据导入/导出的话,还需要安装RedisDump。

配置Redis-Server,进入到根目录,输入命令:redis-server.exe redis.windows.conf,如果没有显示成功则按如下步骤依次输入:
1. redis-cli.exe
2. shutdown
3. exit
4. redis-server.exe redis.windows.conf

设置密码:
首先运行Redis-Server,双击redis-cli.exe
查看密码: config get requirepass
设置密码: config get requirepass 123456
验证密码: auth 123456
OK



Redis和StrictRedis :
redis.py库提供两个类Redis 和 StrictRedis 来实现Redis的命令操作
StrictRedis实现了绝大部分的官方的命令,参数也一一对应,比如set()方法就对应Redis命令的set方法。
Redis是StrictRedis的子类,它的主要功能是用于向后兼容旧版本库里的几个方法,为了兼容,它的方法做了改写,比如item()方法就将value和num参数的位置互换,这和Redis命令行的命令参数不一样

官方推荐使用StrictRedis。


用StriceRedis和ConnectRedis连接Redis,观察源码可以发现:
StrictRedis内其实就是用host和port等参数又构造了一个ConnectionPool,所以直接ConnectionPool当做参数传给StrictRedis也一样。




另外,ConnectionPool还支持通过URL来构建,URL的格式支持如下3种:
1. 创建Redis TCP连接: redis://[:password]@host:port/db          --- url = 'redis://[:123456]@localhost:6379/0'
2. Redis TCP+SSL连接: rediss://[:password]@host:port/db       --- pool = ConnectionPool.from_url(url)
3. RedisUNIX socket连接: unix://[:password]@/path/to/socket.sock?db=db    --- redis = StrictRedis(connection_pool=pool)
只需要构造上面任意一种URL即可,其中password部分如果有则可以写,没有则可以省略。

Redis文档: https://www.w3cschool.cn/redis/



RedisDump
RedisDump提供了强大的Redis数据的导入和导出功能。
首先安装好RedisDump
RedisDump提供了两个可执行命令:redis-dump 用于导出数据,redis-load用于导入数据
首先可以输入redis-dump-h 查看所有可选项
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值