liste de répertoires partielle

Est-il possible d’obtenir un listing de répertoire partiel?

En Python, j’ai un processus qui essaie d’obtenir os.listdir d’un répertoire contenant plus de 100 000 fichiers et cela prend une éternité. Je voudrais pouvoir, disons, obtenir rapidement une liste des 1 000 premiers fichiers.

Comment puis-je atteindre cet objective?

J’ai trouvé une solution qui me donne un ordre aléatoire des fichiers 🙂 (Au moins je ne peux pas voir un modèle)

J’ai d’abord trouvé ce post dans le python maillist . Vous devez copier 3 fichiers sur votre disque ( opendir.pyx, setup.py, test.py ). Ensuite, vous avez besoin du paquet python Pyrex pour comstackr le fichier opendir.pyx partir du post. J’ai eu des problèmes pour installer Pyrex et j’ai découvert que je devais installer python-dev via apt-get . Ensuite, j’ai installé le paquetage opendir partir des trois fichiers téléchargés ci-dessus avec python setup.py install . Le fichier test.py contient des exemples d’utilisation.

Ensuite, je me suis intéressé à la rapidité avec laquelle cette solution serait utilisée avec os.listdir et j’ai créé 200 000 fichiers avec le petit script shell suivant.

 for((i=0; i<200000; i++)) do touch $i done 

Le script suivant est mon benchmark dans le répertoire où je viens de créer les fichiers:

 from opendir import opendir from timeit import Timer import os def list_first_fast(i): d=opendir(".") filenames=[] for _ in range(i): name = d.read() if not name: break filenames.append(name) return filenames def list_first_slow(i): return os.listdir(".")[:i] if __name__ == '__main__': t1 = Timer("list_first_fast(100)", "from __main__ import list_first_fast") t2 = Timer("list_first_slow(100)", "from __main__ import list_first_slow") print "With opendir: ", t1.repeat(5, 100) print "With os.list: ", t2.repeat(5, 100) 

La sortie de mon système est la suivante:

 With opendir: [0.045053958892822266, 0.04376697540283203, 0.0437769889831543, 0.04387712478637695, 0.04404592514038086] With os.list: [9.50291895866394, 9.567682027816772, 9.865844964981079, 13.486984968185425, 9.51977801322937] 

Comme vous pouvez le voir, j'ai obtenu un facteur 200 lors du retour d'une liste de 100 noms de fichiers sur les 200 000, ce qui est plutôt bien :).

J'espère que c'est l'objective que vous essayez d'atteindre.