dircache - Listati di directory memorizzati in cache

Scopo Memorizza listati di directory nella cache, aggiornandoli quando cambia data/ora di modifica di una directory.
Versione Python 1.4 e successive

Elencare i Contenuti di una Directory

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: []

Elenchi annotati

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:

dircache
La documentazione della libreria standard per questo modulo.