uuid und open

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

uuid und open

Beitragvon bwbg » Montag 13. November 2017, 18:43

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

  1. #!/usr/bin/env python3
  2. import os
  3. import uuid
  4.  
  5. from functools import partial
  6.  
  7.  
  8. class FileStorage:
  9.     def __init__(self, path=None):
  10.         assert os.path.isdir(path)
  11.         self.path = os.path.abspath(path)
  12.  
  13.     def __iter__(self):
  14.         for fst, fst_path in _listdirs(self.path):
  15.             for snd, snd_path in _listdirs(fst_path):
  16.                 for thd, _ in _listfiles(snd_path):
  17.                     yield uuid.UUID(''.join([fst, snd, thd]))
  18.  
  19.     def open(self, uuid_, mode='rt', *args, **kwargs):
  20.         if any(e in 'wax+' for e in mode):
  21.             os.makedirs(self.dirname(uuid_), exist_ok=True)
  22.         return open(self.filename(uuid_), mode, *args, **kwargs)
  23.        
  24.     def remove(self, uuid_):
  25.         os.remove(self.filename(uuid_))
  26.        
  27.     def dirname(self, uuid_):
  28.         return os.path.join(self.path, *_split_uuid(uuid_)[:2])
  29.        
  30.     def filename(self, uuid_):
  31.         return os.path.join(self.dirname(uuid_), _split_uuid(uuid_)[2])
  32.  
  33.  
  34. def _split_uuid(uuid_):
  35.     return uuid_.hex[:2], uuid_.hex[2:4], uuid_.hex[4:]
  36.  
  37. def _listdir(path, trait=lambda _: True):
  38.     pjoin = partial(os.path.join, path)
  39.     mapper = partial(map, lambda e: (e, pjoin(e)))
  40.     return mapper(filter(lambda e: trait(pjoin(e)), os.listdir(path)))
  41.  
  42. _listdirs = partial(_listdir, trait=os.path.isdir)
  43. _listfiles = partial(_listdir, trait=os.path.isfile)


  1. >>> import uuid, storage
  2. >>> i = uuid.uuid4()
  3. >>> fs = storage.FileStorage('.objects')
  4. >>> with fs.open(i, 'w') as fp:
  5. ...     fp.write('Hello, world!')
  6. ...
  7. 13
  8. >>> list(fs)
  9. [UUID('01e72d17-b5a6-44ba-930c-2eeb77e4e210')]
  10. >>> with fs.open(i) as fp:
  11. ...     fp.read()
  12. ...
  13. 'Hello, world!'
"Du bist der Messias! Und ich muss es wissen, denn ich bin schon einigen gefolgt!"

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder