Code: Alles auswählen
#!/usr/bin/env python3
import os
import uuid
from functools import partial
class FileStorage:
def __init__(self, path=None):
assert os.path.isdir(path)
self.path = os.path.abspath(path)
def __iter__(self):
for fst, fst_path in _listdirs(self.path):
for snd, snd_path in _listdirs(fst_path):
for thd, _ in _listfiles(snd_path):
yield uuid.UUID(''.join([fst, snd, thd]))
def open(self, uuid_, mode='rt', *args, **kwargs):
if any(e in 'wax+' for e in mode):
os.makedirs(self.dirname(uuid_), exist_ok=True)
return open(self.filename(uuid_), mode, *args, **kwargs)
def remove(self, uuid_):
os.remove(self.filename(uuid_))
def dirname(self, uuid_):
return os.path.join(self.path, *_split_uuid(uuid_)[:2])
def filename(self, uuid_):
return os.path.join(self.dirname(uuid_), _split_uuid(uuid_)[2])
def _split_uuid(uuid_):
return uuid_.hex[:2], uuid_.hex[2:4], uuid_.hex[4:]
def _listdir(path, trait=lambda _: True):
pjoin = partial(os.path.join, path)
mapper = partial(map, lambda e: (e, pjoin(e)))
return mapper(filter(lambda e: trait(pjoin(e)), os.listdir(path)))
_listdirs = partial(_listdir, trait=os.path.isdir)
_listfiles = partial(_listdir, trait=os.path.isfile)
>>> i = uuid.uuid4()
>>> fs = storage.FileStorage('.objects')
>>> with fs.open(i, 'w') as fp:
... fp.write('Hello, world!')
...
13
>>> list(fs)
[UUID('01e72d17-b5a6-44ba-930c-2eeb77e4e210')]
>>> with fs.open(i) as fp:
... fp.read()
...
'Hello, world!'[/code]