โมดูล shelve ในไลบรารีมาตรฐานของ Python เป็นเครื่องมือที่เรียบง่ายแต่อย่างมีประสิทธิภาพสำหรับการเก็บข้อมูลอย่างคงอยู่ (persistent storage) เมื่อไม่จำเป็นต้องใช้ relational database ออบเจ็กต์ shelf ที่นิยามในโมดูลนี้เป็น dictionary-like object ที่ถูกเก็บอย่างคงอยู่ในไฟล์ดิสก์ สร้างไฟล์คล้ายกับฐานข้อมูล dbm บนระบบ UNIX เฉพาะชนิดข้อมูล string เท่านั้นที่ใช้เป็น key ใน dictionary พิเศษนี้ ส่วน value สามารถเป็นออบเจ็กต์ที่ picklable ได้ทุกชนิด
โมดูล shelve นิยามสามคลาสดังนี้:
| ลำดับ | โมดูล & คำอธิบาย |
|---|---|
| 1 | Shelf เป็นคลาสฐานสำหรับ shelf implementations เริ่มต้นด้วย dict-like object |
| 2 | BsdDbShelf เป็น subclass ของ Shelf dict object ที่ส่งให้คอนสตรัคเตอร์ต้องรองรับเมธอด first(), next(), previous(), last() และ set_location() |
| 3 | DbfilenameShelf เป็น subclass ของ Shelf เช่นกัน แต่รับ filename เป็นพารามิเตอร์ให้คอนสตรัคเตอร์ แทนที่จะเป็น dict object |
วิธีที่ง่ายที่สุดในการสร้าง Shelf object คือใช้ฟังก์ชัน open() ที่นิยามในโมดูล shelve ซึ่งคืนค่า DbfilenameShelf object
open(filename, flag='c', protocol=None, writeback=False)
พารามิเตอร์ filename ถูกกำหนดให้กับฐานข้อมูลที่สร้าง
ค่าเริ่มต้นของพารามิเตอร์ flag คือ 'c' สำหรับการเข้าถึงอ่าน/เขียน flag อื่นๆ คือ 'w' (เขียนอย่างเดียว) 'r' (อ่านอย่างเดียว) และ 'n' (ใหม่พร้อมอ่าน/เขียน)
พารามิเตอร์ protocol หมายถึง pickle protocol writeback parameter ค่าเริ่มต้นเป็น false หากตั้งเป็น true รายการที่เข้าถึงจะถูกแคช ทุกการเข้าถึงจะเรียก sync() และ close() ทำให้กระบวนการอาจช้าลง
โค้ดต่อไปนี้สร้างฐานข้อมูลและเก็บรายการ dictionary ไว้:
import shelve
s = shelve.open("test")
s['name'] = "Ajay"
s['age'] = 23
s['marks'] = 75
s.close()
จะสร้างไฟล์ test.dir ในไดเรกทอรีปัจจุบันและเก็บข้อมูล key-value ในรูปแบบแฮช Shelf object มีเมธอดต่อไปนี้:
| ลำดับ | เมธอด & คำอธิบาย |
|---|---|
| 1 | close() ซิงโครไนซ์และปิด persistent dict object |
| 2 | sync() เขียนคืนรายการทั้งหมดในแคช หาก shelf เปิดด้วย writeback=True |
| 3 | get() คืนค่า value ที่เชื่อมโยงกับ key |
| 4 | items() ลิสต์ของ tuples แต่ละ tuple เป็น key-value pair |
| 5 | keys() ลิสต์ของ shelf keys |
| 6 | pop() ลบ key ที่ระบุและคืนค่า value ที่ตรงกัน |
| 7 | update() อัปเดต shelf จาก dict/iterable อื่น |
| 8 | values() ลิสต์ของ shelf values |
เพื่อเข้าถึงค่าของ key เฉพาะใน shelf:
>>> s = shelve.open('test')
>>> s['age']
23
>>> s['age'] = 25
>>> s.get('age')
25
เมธอด items(), keys() และ values() คืนค่า view objects:
>>> list(s.items())
[('name', 'Ajay'), ('age', 25), ('marks', 75)]
>>> list(s.keys())
['name', 'age', 'marks']
>>> list(s.values())
['Ajay', 25, 75]
เพื่อลบ key-value pair จาก shelf:
>>> s.pop('marks')
75
>>> list(s.items())
[('name', 'Ajay'), ('age', 25)]
สังเกตว่า key-value pair ของ marks-75 ถูกลบแล้ว
เพื่อรวมรายการของ dictionary อื่นกับ shelf ใช้เมธอด update():
>>> d = {'salary': 10000, 'designation': 'manager'}
>>> s.update(d)
>>> list(s.items())
[('name', 'Ajay'), ('age', 25), ('salary', 10000), ('designation', 'manager')]
ในบทความนี้เราเรียนรู้เกี่ยวกับโมดูล shelve ซึ่งให้กลไกที่สะดวกสำหรับเก็บ dictionary object แบบคงอยู่