shelve是python中一種儲存結構化資料的模組,用法跟字典相似,以鍵值對的形式儲存。基本使用方法:
1.引入模組
import shelve
2.建立資料檔案:
with shelve.open(filename) as
object:
object = shelve.open(filename)
兩種檔案操作的方式均可以。不難看出,對shelf檔案資料的讀寫是不用指定檔案開啟方式的,直接open就可以了,跟json比起來較方便,儘管只適用於python程式。對於shelf內容的操作,不用像檔案操作一樣,需要readline等先對資料做一波處理,也不用像pickle/json一樣需要load/dump,更不需要像pformat一樣將資料結構輸出為字串,格式化寫入程式檔案進行呼叫,對於shelf的操作,如上object即可視為字典變數,操作同字典
3.shelf的鍵值只能儲存基礎的資料結構,例如file型別就不行
4.shelf雖然同字典很類似,但略有差別,key只能是字串型別,不能是數值
最近在code刻意使用了一下shelve模組,確實相當好用,幾乎跟字典一摸一樣(當然不是這樣),由此遇到了兩個問題,也花了一點時間去發現問題,更為深入的了解了一下shelve模組。上**。
問題一:
import shelve
with shelve.open('asdf') as b:
b = ,
'c':}if
'b'in b:
print('yes')
print (list(b.keys()))
print(b['c']['d'])
>>>>
yes['b', 'c']
5000
乍一看,確實沒有問題,這就算是資料儲存好了,那麼模擬讀取資料試試看。
import shelve
with shelve.open('asdf') as b:
# b = ,
# 'c':
# }if
'b'in b:
print('yes')
print (list(b.keys()))
print(b['c']['d'])
>>>>
traceback (most recent call last):
file "c:\users\stan pao\desktop\辦公\python\test\temp_test.py", line 13, in
print(b['c']['d'])
執行拋錯,可以看出,儲存的資料呢?這跟是空的麼。檢查一下生成的三個檔案,好像確實都是空的(windows下shelf檔案是生成三個,兩個可讀乙個不可讀,linux下生成乙個二進位制檔案,不可讀)。
直接上結論:經過一番嘗試,shelf鍵值對進行資料結構儲存時,只能嚴格按照key = value這樣的形式儲存,而不能想當然完全將shelf視為字典直接進行初始化。
import shelve
with shelve.open('asdf') as b:
b['b'] =
b['c'] =
if'b'in b:
print('yes')
print (list(b.keys()))
print(b['c']['d']
如此即可。
問題二:
本來想從shelf中獲得資料修改以儲存,但是失敗了。
import shelve
with shelve.open('asdf') as b:
b['b'] =
b['c'] =
b['c']['d'] = 1000
if'b'
in b:
print('yes')
print (list(b.keys()))
print(b['c']['d'])
>>>>
yes['b', 'c']
5000
明明對其賦值成為1000,怎麼沒變呢?shelf預設初始化儲存資料之後是不進行會寫,因此之後的資料變動不會被寫入,因此只要指定writeback引數即可
import shelve
with shelve.open('asdf',writeback=true) as b:
b['b'] =
b['c'] =
b['c']['d'] = 1000
if'b'
in b:
print('yes')
print (list(b.keys()))
print(b['c']['d'])
>>>>
yes['b', 'c']
1000
python shelve程式設計
你如果需要乙個簡單的儲存方案,那麼,python中shelve模板可以滿足你的。shelve唯一有趣的函式open,呼叫的時候返回乙個shelf物件,你可以用它來儲存物件。只需要把她當做字典來使用就可以了。但是一定注意 鍵一定是字串。所以如果你的鍵是數字,建議轉換一些。int str 函式str。例...
模組的使用,模組的搜尋路徑
模組的使用 1 什麼是模組 模組是一系列功能的集合體 常見的模組形式 自定義模組 第三方模組 內建模組 1 乙個module.py檔案就是乙個模組,檔名是module.py,而模組名是module 2 乙個包含有 init py檔案的資料夾也是模組 3 已被編譯為共享庫或dll的c或c 擴充套件 4...
python模組 os模組的用法
1 os.getcwd 獲取當前工作的目錄,即當前python指令碼工作的目錄路徑 23 os.phdir dirname 改變當前指令碼的工作目錄 相當於shell下cd 45 os.curdir 返回當前目錄 67 os.pardir 獲取當前目錄字串名 89 os.makedirs dirna...