lang/python/ PyShelve


Shelve provides a persistent store. It relies on pickle, so comes with pickle's caveats about untrusted data.

Example

put.py

from datetime import datetime
import shelve
import sys
args = sys.argv[1:]
if len(args) == 0:
  keys = ["_"]
else:
  keys = args
data = sys.stdin.read()
with shelve.open("span") as db:
  for key in keys:
    db[key] = data
    print(f"Stored {len(data)} bytes to {key}")

get.py

from datetime import datetime
import shelve
import sys
args = sys.argv[1:]
if len(args) == 0:
  keys = ["_"]
else:
  keys = args
with shelve.open("span") as db:
  for key in keys:
    if key in db:
      print(f"{key}: {db[key]}")
    else:
      print(f"{key} <absent>")

If gdbm is available, Python uses that, else it uses a simple file produced by concatenating pickled data and maintaining a directory which maps key to a byte range.