数据之路 - Python爬虫 - 数据存储

一、文件存储

1.文件打开方式

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

2.txt文本存储

with open('explore.txt', 'a', encoding='utf-8') as file:file.write('\n'.join([question, author, answer]))file.write('\n' + '=' * 50 + '\n')

3.json文件存储

调用库的loads()方法将JSON文本字符串转为JSON对象,可以通过dumps()方法将JSON对象转为文本字符串

- 读取json

import jsonstr = '''
[{"name": "Bob","gender": "male","birthday": "1992-10-18"
}, {"name": "Selina","gender": "female","birthday": "1995-10-18"
}]
'''
print(type(str))
data = json.loads(str)
print(data)
print(type(data))

- 输出json

import jsondata = [{'name': 'Bob','gender': 'male','birthday': '1992-10-18'
}]
with open('data.json', 'w') as file:file.write(json.dumps(data))

4.csv文件存储

- 写入

首先,打开data.csv文件,然后指定打开的模式为w(即写入),获得文件句柄,随后调用csv库的writer()方法初始化写入对象,传入该句柄,然后调用writerow()方法传入每行的数据即可完成写入。writerows()方法同时写入多行

import csvwith open('data.csv', 'w') as csvfile:writer = csv.writer(csvfile, delimiter=' ')writer.writerow(['id', 'name', 'age'])writer.writerow(['10001', 'Mike', 20])writer.writerow(['10002', 'Bob', 22])writer.writerow(['10003', 'Jordan', 21])

- 读取

import csvwith open('data.csv', 'r', encoding='utf-8') as csvfile:reader = csv.reader(csvfile)for row in reader:print(row)

二、MySQL关系型数据库存储

1.MySQL连接

import pymysql
# connect()方法声明一个MySQL连接对象
db = pymysql.connect(host='localhost',user='root', password='123456', port=3306)
# cursor()方法获得MySQL的操作游标,利用游标来执行SQL语句
cursor = db.cursor()
# 创建students数据表
sql = 'CREATE TABLE IF NOT EXISTS students (id VARCHAR(255) NOT NULL, name VARCHAR(255) NOT NULL, age INT NOT NULL, PRIMARY KEY (id))'
cursor.execute(sql)

2.插入

import pymysqlid = '20120001'
user = 'Bob'
age = 20db = pymysql.connect(host='localhost', user='root', password='123456', port=3306, db='spiders')
cursor = db.cursor()
sql = 'INSERT INTO students(id, name, age) values(%s, %s, %s)'
try:cursor.execute(sql, (id, user, age))db.commit()
except:db.rollback()
db.close()
==================================================================================================
data = {'id': '20120001','name': 'Bob','age': 20 } table = 'students' keys = ', '.join(data.keys()) values = ', '.join(['%s'] * len(data)) sql = 'INSERT INTO {table}({keys}) VALUES ({values})'.format(table=table, keys=keys, values=values) try:if cursor.execute(sql, tuple(data.values())):print('Successful')db.commit() except:print('Failed')db.rollback() db.close()

3.更新

sql = 'UPDATE students SET age = %s WHERE name = %s'
try:cursor.execute(sql, (25, 'Bob'))db.commit()
except:db.rollback()
db.close()
===========================================================================================================================
data = {'id': '20120001','name': 'Bob','age': 21
}table = 'students'
keys = ', '.join(data.keys())
values = ', '.join(['%s'] * len(data))sql = 'INSERT INTO {table}({keys}) VALUES ({values}) ON DUPLICATE KEY UPDATE'.format(table=table, keys=keys, values=values)
update = ','.join([" {key} = %s".format(key=key) for key in data])
sql += update
try:if cursor.execute(sql, tuple(data.values())*2):print('Successful')db.commit()
except:print('Failed')db.rollback()
db.close()

4.删除

table = 'students'
condition = 'age > 20'sql = 'DELETE FROM  {table} WHERE {condition}'.format(table=table, condition=condition)
try:cursor.execute(sql)db.commit()
except:db.rollback()db.close()

5.查询

sql = 'SELECT * FROM students WHERE age >= 20'try:cursor.execute(sql)print('Count:', cursor.rowcount)one = cursor.fetchone()print('One:', one)results = cursor.fetchall()print('Results:', results)print('Results Type:', type(results))for row in results:print(row)
except:print('Error')

三、MongoDB非关系型数据库存储

1.MongoDB连接

import pymongo
# 连接MongoDB
client = pymongo.MongoClient(host='localhost', port=27017)
# 指定数据库
db = client.test
# 指定集合(类似于数据表)
collection = db.students

2.插入

student = {'id': '20170101','name': 'Jordan','age': 20,'gender': 'male'
}student1 = {'id': '20170101','name': 'Jordan','age': 20,'gender': 'male'
}student2 = {'id': '20170202','name': 'Mike','age': 21,'gender': 'male'
}result = collection.insert(student)
result = collection.insert([student1, student2])
result = collection.insert_many([student1, student2])
print(result)

3.查询

# find_one()查询得到的是单个结果,find()则返回一个生成器对象。
result = collection.find_one({'name': 'Mike'})
result = collection.find_all({'name': 'Mike'})

- 常用符号

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

4.更新

condition = {'name': 'Kevin'}
student = collection.find_one(condition)
student['age'] = 25
result = collection.update(condition, student)
print(result)# update_many()方法,则会将所有符合条件的数据都更新
# update_one()方法,则会将单个符合条件的数据都更新

5.删除

# remove()将符合条件的所有数据删除
result = collection.remove({'name': 'Kevin'})
print(result)
# delete_one()删除第一条符合条件的数据
result = collection.delete_one({'name': 'Kevin'})
print(result)
print(result.deleted_count)
# delete_many()即删除所有符合条件的数据
result = collection.delete_many({'age': {'$lt': 25}})
print(result.deleted_count)
# deleted_count属性获取删除的数据条数

四、Redis非关系型数据库存储

1.Redis连接

from redis import StrictRedisredis = StrictRedis(host='localhost', port=6379, db=0, password='foobared')
redis.set('name', 'Bob')    
print(redis.get('name'))    

2.键操作

方法作用参数说明
exists(name)判断一个键是否存在name:键名
delete(name)删除一个键name:键名
type(name)判断键类型name:键名
keys(pattern)获取所有符合规则的键pattern:匹配规则
randomkey()获取随机的一个键 
rename(src, dst)重命名键src:原键名;dst:新键名
dbsize()获取当前数据库中键的数目 
expire(name, time)设定键的过期时间,单位为秒name:键名;time:秒数
ttl(name)获取键的过期时间,单位为秒,-1表示永久不过期name:键名
move(name, db)将键移动到其他数据库name:键名;db:数据库代号
flushdb()删除当前选择数据库中的所有键 
flushall()删除所有数据库中的所有键 

3.字符串操作

方法作用参数说明
set(name, value)给数据库中键为namestring赋予值valuename: 键名;value: 值
get(name)返回数据库中键为namestringvaluename:键名
getset(name, value)给数据库中键为namestring赋予值value并返回上次的valuename:键名;value:新值
mget(keys, *args)返回多个键对应的valuekeys:键的列表
setnx(name, value)如果不存在这个键值对,则更新value,否则不变name:键名
setex(name, time, value)设置可以对应的值为string类型的value,并指定此键值对应的有效期name: 键名;time: 有效期; value:值
setrange(name, offset, value)设置指定键的value值的子字符串name:键名;offset:偏移量;value:值
mset(mapping)批量赋值mapping:字典
msetnx(mapping)键均不存在时才批量赋值mapping:字典
incr(name, amount=1)键为namevalue增值操作,默认为1,键不存在则被创建并设为amountname:键名;amount:增长的值
decr(name, amount=1)键为namevalue减值操作,默认为1,键不存在则被创建并将value设置为-amountname:键名; amount:减少的值
append(key, value)键为namestring的值附加valuekey:键名
substr(name, start, end=-1)返回键为namestring的子串name:键名;start:起始索引;end:终止索引,默认为-1,表示截取到末尾
getrange(key, start, end)获取键的value值从startend的子字符串key:键名;start:起始索引;end:终止索引

4.列表操作

方法作用参数说明
rpush(name, *values)在键为name的列表末尾添加值为value的元素,可以传多个name:键名;values:值
lpush(name, *values)在键为name的列表头添加值为value的元素,可以传多个name:键名;values:值
llen(name)返回键为name的列表的长度name:键名
lrange(name, start, end)返回键为name的列表中startend之间的元素name:键名;start:起始索引;end:终止索引
ltrim(name, start, end)截取键为name的列表,保留索引为startend的内容name:键名;start:起始索引;end:终止索引
lindex(name, index)返回键为name的列表中index位置的元素name:键名;index:索引
lset(name, index, value)给键为name的列表中index位置的元素赋值,越界则报错name:键名;index:索引位置;value:值
lrem(name, count, value)删除count个键的列表中值为value的元素name:键名;count:删除个数;value:值
lpop(name)返回并删除键为name的列表中的首元素name:键名
rpop(name)返回并删除键为name的列表中的尾元素name:键名
blpop(keys, timeout=0)返回并删除名称在keys中的list中的首个元素,如果列表为空,则会一直阻塞等待keys:键列表;timeout: 超时等待时间,0为一直等待
brpop(keys, timeout=0)返回并删除键为name的列表中的尾元素,如果list为空,则会一直阻塞等待keys:键列表;timeout:超时等待时间,0为一直等待
rpoplpush(src, dst)返回并删除名称为src的列表的尾元素,并将该元素添加到名称为dst的列表头部src:源列表的键;dst:目标列表的key

5.集合操作

方法作用参数说明
sadd(name, *values)向键为name的集合中添加元素name:键名;values:值,可为多个
srem(name, *values)从键为name的集合中删除元素name:键名;values:值,可为多个
spop(name)随机返回并删除键为name的集合中的一个元素name:键名
smove(src, dst, value)从src对应的集合中移除元素并将其添加到dst对应的集合中src:源集合;dst:目标集合;value:元素值
scard(name)返回键为name的集合的元素个数name:键名
sismember(name, value)测试member是否是键为name的集合的元素name:键值
sinter(keys, *args)返回所有给定键的集合的交集keys:键列表
sinterstore(dest, keys, *args)求交集并将交集保存到dest的集合dest:结果集合;keys:键列表
sunion(keys, *args)返回所有给定键的集合的并集keys:键列表
sunionstore(dest, keys, *args)求并集并将并集保存到dest的集合dest:结果集合;keys:键列表
sdiff(keys, *args)返回所有给定键的集合的差集keys:键列表
sdiffstore(dest, keys, *args)求差集并将差集保存到dest集合dest:结果集合;keys:键列表
smembers(name)返回键为name的集合的所有元素name:键名
srandmember(name)随机返回键为name的集合中的一个元素,但不删除元素name:键值

6.有序集合操作

方法作用参数说明
zadd(name, *args, **kwargs)向键为name的zset中添加元素member,score用于排序。如果该元素存在,则更新其顺序name: 键名;args:可变参数
zrem(name, *values)删除键为name的zset中的元素name:键名;values:元素
zincrby(name, value, amount=1)如果在键为name的zset中已经存在元素value,则将该元素的score增加amount;否则向该集合中添加该元素,其score的值为amountname:key名;value:元素;amount:增长的score值
zrank(name, value)返回键为name的zset中元素的排名,按score从小到大排序,即名次name:键名;value:元素值
zrevrank(name, value)返回键为name的zset中元素的倒数排名(按score从大到小排序),即名次name:键名;value:元素值
zrevrange(name, start, end, withscores=False)返回键为name的zset(按score从大到小排序)中index从start到end的所有元素name:键值;start:开始索引;end:结束索引;withscores:是否带score
zrangebyscore(name, min, max, start=None, num=None, withscores=False)返回键为name的zset中score在给定区间的元素name:键名;min:最低score;max:最高score;start:起始索引;num:个数;withscores:是否带score
zcount(name, min, max)返回键为name的zset中score在给定区间的数量name:键名;min:最低score;max:最高score
zcard(name)返回键为name的zset的元素个数name:键名
zremrangebyrank(name, min, max)删除键为name的zset中排名在给定区间的元素name:键名;min:最低位次;max:最高位次
zremrangebyscore(name, min, max)删除键为name的zset中score在给定区间的元素name:键名;min:最低score;max:最高score

7.散列操作

方法作用参数说明
hset(name, key, value)向键为name的散列表中添加映射name:键名;key:映射键名;value:映射键值
hsetnx(name, key, value)如果映射键名不存在,则向键为name的散列表中添加映射name:键名;key:映射键名;value:映射键值
hget(name, key)返回键为name的散列表中key对应的值name:键名;key:映射键名
hmget(name, keys, *args)返回键为name的散列表中各个键对应的值name:键名;keys:映射键名列表
hmset(name, mapping)向键为name的散列表中批量添加映射name:键名;mapping:映射字典
hincrby(name, key, amount=1)将键为name的散列表中映射的值增加amountname:键名;key:映射键名;amount:增长量
hexists(name, key)键为name的散列表中是否存在键名为键的映射name:键名;key:映射键名
hdel(name, *keys)在键为name的散列表中,删除键名为键的映射name:键名;keys:映射键名
hlen(name)从键为name的散列表中获取映射个数name: 键名
hkeys(name)从键为name的散列表中获取所有映射键名name:键名
hvals(name)从键为name的散列表中获取所有映射键值name:键名
hgetall(name)从键为name的散列表中获取所有映射键值对name:键名

8.RedisDump

RedisDump提供了两个可执行命令:redis-dump用于导出数据,redis-load用于导入数据。

转载于:https://www.cnblogs.com/Iceredtea/p/11094753.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/392998.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

创建react应用程序_如何使用React创建一个三层应用程序

创建react应用程序Discover Functional JavaScript was named one of the best new Functional Programming books by BookAuthority!“发现功能JavaScript”被BookAuthority评为最佳新功能编程书籍之一 ! Splitting a Single Page Application into layers has a …

linux update语句,MySQL 多表 update sql语句总结

MySQL 多表 update 有几种不同的写法。假定我们有两张表,一张表为Product表存放产品信息,其中有产品价格列Price;另外一张表是ProductPrice表,我们要将ProductPrice表中的价格字段Price更新为Price表中价格字段的80%。在Mysql中我…

linux延时与定时操作

1、at ---系统延迟任务发起命令 at time >command ---任务指令 >ctrld ---发起任务 at -l ---列出延时任务Id at -r id ---删除改id任务 at -m ---让无输出的命令产生邮件 at -M ---让有输…

windows修改PowerShell(命令提示符)默认中文编码方式

如果以下方法都没有作用的话&#xff0c;可以直接在代码中调用<stdlib.h>中的system("mode con cp select65001")或者是system("chcp 65001")。当然&#xff0c;前提是你用的也是C、C、C#等强类型编程语言。 **************************************…

leetcode面试题 17.07. 婴儿名字(并查集)

每年&#xff0c;政府都会公布一万个最常见的婴儿名字和它们出现的频率&#xff0c;也就是同名婴儿的数量。有些名字有多种拼法&#xff0c;例如&#xff0c;John 和 Jon 本质上是相同的名字&#xff0c;但被当成了两个名字公布出来。给定两个列表&#xff0c;一个是名字及对应…

appium+python+iOS 环境搭建与使用中常见问题的解决方案链接

&#xff08;1&#xff09;WebDriverAgent 安装入门篇&#xff1a;https://www.cnblogs.com/zhanggui/p/9239827.html 重点摘要&#xff1a; 在WDA的Github上也给出了WDA的特性&#xff1a; 1.支持真机 &&模拟器 在模拟器上运行还是比较方便的&#xff0c;在真机上需要…

api工厂接口路径是什么_为什么(几乎)永远不要再使用绝对路径访问API

api工厂接口路径是什么by Vitaly Kondratiev通过维塔利康德拉季耶夫(Vitaly Kondratiev) 为什么(几乎)永远不要再使用绝对路径访问API (Why you should (almost) never use an absolute path to your APIs again) Recent advances in web apps architecture show that a decou…

双机通信c语言程序,上传一个自己编写的I2C双机通信程序

本帖最后由 micro_听海 于 2012-11-24 19:58 编辑这几天一直在搞AVR的twi(twi就是i2c)双机通信程序&#xff0c;使用的是两块arduino开发板。因为最总要这个通信程序最总是要放在winavr的编译环境中&#xff0c;所以没有使用arduino自带的库函数。但是这没关系&#xff0c;因为…

leetcode684. 冗余连接(并查集)

在本问题中, 树指的是一个连通且无环的无向图。 输入一个图&#xff0c;该图由一个有着N个节点 (节点值不重复1, 2, …, N) 的树及一条附加的边构成。附加的边的两个顶点包含在1到N中间&#xff0c;这条附加的边不属于树中已存在的边。 结果图是一个以边组成的二维数组。每一…

Windows Server 2008 部署权限管理RMS

1.1 实战&#xff1a;部署权限管理 试验目的&#xff1a; 在单域环境中部署活动目录权限管理服务&#xff0c;实现文档的保护。 试验环境&#xff1a; ? DCServer安装Windows Server 2008企业版&#xff0c;是ess.com的域控制器&#xff0c;安装企业CA。 ? RMSServer安装Wind…

day5 Python爬虫学习

一 实现京东上的自动搜索并提取信息 from selenium import webdriver # 导入键盘Keys from selenium.webdriver.common.keys import Keys import timedriver webdriver.Chrome()# 检测代码块 try:# 隐式等待&#xff0c;等待标签加载driver.implicitly_wait(10)# 往京东主页…

虚拟dom添加虚拟dom_虚拟DOM缓慢。 认识记忆化的DOM

虚拟dom添加虚拟domby Sindre Osen Aarsaether通过Sindre Osen Aarsaether 虚拟DOM缓慢。 符合已记忆的DOM。 (The Virtual DOM is slow. Meet the Memoized DOM.) 超越虚拟DOM和状态管理 (Moving beyond the Virtual DOM and State Management) The virtual DOM was a fantas…

编写一个字节数的rtu C语言校验程序,Modbus通信协议中CRC校验的快速C语言算法

Modbus通信协议中CRC校验的快速C语言算法2004年第11期            福 建 电 脑  63Modbus通信协议中CRC校验的快速C语言算法孟开元(西安石油大学计算机学院陕西西安710065)【摘 要】 本文主要讨论了Modbus通信协议的RTU帧格式中常用的错误校验方法,即循环冗…

leetcode1319. 连通网络的操作次数(并查集)

用以太网线缆将 n 台计算机连接成一个网络&#xff0c;计算机的编号从 0 到 n-1。线缆用 connections 表示&#xff0c;其中 connections[i] [a, b] 连接了计算机 a 和 b。 网络中的任何一台计算机都可以通过网络直接或者间接访问同一个网络中其他任意一台计算机。 给你这个…

Codeforces 600E Lomsat gelral (树上启发式合并)

题目链接 Lomsat gelral 占坑……等深入理解了再来补题解…… #include <bits/stdc.h>using namespace std;#define rep(i, a, b) for (int i(a); i < (b); i)typedef long long LL;const int N 600010;int n; int cc[N], col[N], sz[N], son[N]; LL ans[N];vect…

如何让CloudStack使用KVM创建Windows实例成功识别并挂载数据盘

问题产生背景&#xff1a; 使用CloudStack KVM组合进行资源池纳管工作&#xff0c;通过ISO镜像文件创建了两个模板&#xff1a; RHEL6U3 64位系统以及WindowsServer2008 R2 SP1 64位系统。然后通过模板创建实例&#xff0c;挂载外接存储&#xff0c;实例启动后&#xff0c;通过…

云计算openstack介绍

转载于:https://www.cnblogs.com/WIU1905/p/11107593.html

C语言Node lt T gt,c语言论坛填空;#includelt;stdio.hgt;# 爱问知识人

填空&#xff1b;#include #include #define N 6typedef struct node {int data;struct node *next;填空&#xff1b;#include #include #define N 6typedef struct node {int data;struct node *next;} NODE;void fun(NODE *h){ NODE *p, *q; int t;/**********found*********…

gitlab设置邮件服务器_如何设置您自己的一次性电子邮件服务器

gitlab设置邮件服务器by Oren Geva由Oren Geva 如何设置您自己的一次性电子邮件服务器 (How To Setup Your Own Disposable Email Server) Disposable email services are online services that provide temporary email addresses for registering or signing up on websites…

leetcode442. 数组中重复的数据

给定一个整数数组 a&#xff0c;其中1 ≤ a[i] ≤ n &#xff08;n为数组长度&#xff09;, 其中有些元素出现两次而其他元素出现一次。 找到所有出现两次的元素。 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗&#xff1f; 示例&#xff1a; 输入: [4,3,2…