生活随笔 
收集整理的這篇文章主要介紹了
                                
数据之路 - 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  = 20
db  = 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用于導入數據。 
 
轉載于:https://www.cnblogs.com/Iceredtea/p/11094753.html
                            總結 
                            
                                以上是生活随笔 為你收集整理的数据之路 - Python爬虫 - 数据存储 的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                            
                                如果覺得生活随笔 網站內容還不錯,歡迎將生活随笔 推薦給好友。