文件打开方式:
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 查看所有可选项
数据存储
最新推荐文章于 2023-06-15 15:33:29 发布