一、文件存儲
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) | 給數據庫中鍵為name 的string 賦予值value | name : 鍵名;value : 值 |
get(name) | 返回數據庫中鍵為name 的string 的value | name :鍵名 |
getset(name, value) | 給數據庫中鍵為name 的string 賦予值value 并返回上次的value | name :鍵名;value :新值 |
mget(keys, *args) | 返回多個鍵對應的value | keys :鍵的列表 |
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) | 鍵為name 的value 增值操作,默認為1,鍵不存在則被創建并設為amount | name :鍵名;amount :增長的值 |
decr(name, amount=1) | 鍵為name 的value 減值操作,默認為1,鍵不存在則被創建并將value 設置為-amount | name :鍵名;?amount :減少的值 |
append(key, value) | 鍵為name 的string 的值附加value | key :鍵名 |
substr(name, start, end=-1) | 返回鍵為name 的string 的子串 | name :鍵名;start :起始索引;end :終止索引,默認為-1,表示截取到末尾 |
getrange(key, start, end) | 獲取鍵的value 值從start 到end 的子字符串 | 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 的列表中start 至end 之間的元素 | name :鍵名;start :起始索引;end :終止索引 |
ltrim(name, start, end) | 截取鍵為name 的列表,保留索引為start 到end 的內容 | 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的值為amount | name: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的散列表中映射的值增加amount | name:鍵名;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用于導入數據。