uuid und open

Code-Stücke können hier veröffentlicht werden.
Antworten
Benutzeravatar
bwbg
User
Beiträge: 379
Registriert: Mittwoch 23. Januar 2008, 13:35

Montag 13. November 2017, 18:43

Hier eine kleine Spielerei von mir. Vielleicht findes es jemand brauchbar:

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)
[codebox=pycon file=Unbenannt.txt]>>> import uuid, storage
>>> 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]
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"
Antworten