Scopo | Memorizza listati di directory nella cache, aggiornandoli quando cambia data/ora di modifica di una directory. |
Versione Python | 1.4 e successive |
A partire dal 1 gennaio 2021 le versioni 2.x di Python non sono piu' supportate. Ti invito a consultare la corrispondente versione 3.x dell'articolo per le versioni 3.x di Python
La funzione principale nell'API
dircache
è
listdir()
, un wrapper attorno alla funzione
os.listdir()
che memorizza i risultati in cache e restituisce lo stesso elenco ogni volta che viene chiamata con un percorso a meno che la data/ora di modifica della directory in questione risulti cambiata.
import dircache
path = '.'
first = dircache.listdir(path)
second = dircache.listdir(path)
print 'Contenuto :', first
print 'Identica :', first is second
print 'Uguale :', first == second
E' importante realizzare che la stessa esatta lista viene restituita ogni volta, quindi non dovrebbe essere modificata sul posto.
$ python dircache_listdir.py Contenuto : ['dircache_listdir.py'] Identica : True Uguale : True
Naturalmente se il contenuto della directory cambia esso viene rielaborato.
import dircache
import os
path = '/tmp'
file_to_create = os.path.join(path, 'pymotw_tmp.txt')
# Ottiene il contenuto della directory
first = dircache.listdir(path)
# Crea un nuovo file
open(file_to_create, 'wt').close()
# Rielabora il contenuto della directory
second = dircache.listdir(path)
# Elimina il file appena creato
os.unlink(file_to_create)
print 'Identica :', first is second
print 'Uguale :', first == second
print 'Differenze:', list(set(second) - set(first))
In questo caso il nuovo file provoca la ricostruzione della lista.
$ python dircache_listdir_file_added.py Identica : False Uguale : False Differenze: ['pymotw_tmp.txt']
E' anche possibile reimpostare l'intera cache, scaricandone il contenuto in modo che ogni percorso venga rielaborato.
import dircache
path = '/tmp'
first = dircache.listdir(path)
dircache.reset()
second = dircache.listdir(path)
print 'Identica :', first is second
print 'Uguale :', first == second
print 'Differenza:', list(set(second) - set(first))
$ python dircache_reset.py Identica : False Uguale : True Differenza: []
L'altra interessante funzione fornita dal modulo
dircache
è
annotate()
. Quando chiamata, annotate() modifica un elenco restituito da listdir() aggiungendo un '/' alla fine dei nomi che rappresentano delle directory. (Purtroppo per gli utenti Windows, sebbene il modulo usi os.path.join() per costruire i nomi, viene sempre aggiunto '/', non os.sep. )
import dircache
from pprint import pprint
import os
path = '../..'
contents = dircache.listdir(path)
annotated = contents[:]
dircache.annotate(path, annotated)
fmt = '%20s\t%20s'
print fmt % ('ORIGINALI', 'ANNOTATI')
print fmt % (('-' * 20,)*2)
for o, a in zip(contents, annotated):
print fmt % (o, a)
$ python dircache_annotate.py ORIGINALI ANNOTATI -------------------- -------------------- c.py c.py d.py d.py fr.py fr.py misc misc/ mybk mybk/ pymotw-it pymotw-it/ robbylib robbylib/
Vedere anche: