Comment puis-je trouver tous les fichiers dans un répertoire ayant l'extension .txt
en python?
1043
Vous pouvez utiliser glob
:
import glob, os
os.chdir("/mydir")
for file in glob.glob("*.txt"):
print(file)
ou simplement os.listdir
:
import os
for file in os.listdir("/mydir"):
if file.endswith(".txt"):
print(os.path.join("/mydir", file))
ou si vous souhaitez parcourir le répertoire, utilisez os.walk
:
import os
for root, dirs, files in os.walk("/mydir"):
for file in files:
if file.endswith(".txt"):
print(os.path.join(root, file))
for file in f
que pourfor files in f
puisque ce qui est dans la variable est un nom de fichier unique. Encore mieux serait de changer les bouclesf
tofiles
, puis les boucles for pourraient devenirfor file in files
.file
n'est pas un mot réservé, juste le nom d'une fonction prédéfinie, il est donc tout à fait possible de l'utiliser comme nom de variable dans votre propre code. Bien qu'il soit vrai qu'en général, il faut éviter de telles collisions,file
c'est un cas particulier car il n'y a presque jamais besoin de l'utiliser, il est donc souvent considéré comme une exception à la directive. Si vous ne voulez pas faire cela, PEP8 recommande d'ajouter un seul trait de soulignement à ces noms, c'estfile_
-à- dire que vous devez accepter est encore tout à fait lisible.Utilisez glob .
la source
glob
vous ne pouvez pas trouver de fichiers récursivement si votre python est inférieur à 3.5. plus d'informationsQuelque chose comme ça devrait faire le travail
la source
root, dirs, files
au lieu der, d, f
. Beaucoup plus lisible.Quelque chose comme ça fonctionnera:
la source
os.path.join
sur chaque élément detext_files
. Ça pourrait être quelque chose comme çatext_files = [os.path.join(path, f) for f in os.listdir(path) if f.endswith('.txt')]
.Vous pouvez simplement utiliser
pathlib
s 1 :glob
ou en boucle:
Si vous le souhaitez récursif, vous pouvez utiliser
.glob('**/*.txt)
1 Le
pathlib
module a été inclus dans la bibliothèque standard de python 3.4. Mais vous pouvez installer les ports arrière de ce module même sur les anciennes versions de Python (c'est-à-dire en utilisantconda
oupip
):pathlib
etpathlib2
.la source
**/*.txt
n'est pas pris en charge par les anciennes versions de python. J'ai donc résolu ce problème avec:foundfiles= subprocess.check_output("ls **/*.txt", shell=True)
for foundfile in foundfiles.splitlines():
print foundfile
pathlib
peut faire et j'ai déjà inclus les exigences de la version Python. :) Mais si votre approche n'a pas encore été publiée, pourquoi ne pas simplement l'ajouter comme autre réponse?rglob
si vous souhaitez rechercher des éléments de manière récursive. Par exemple.rglob('*.txt')
la source
J'aime os.walk () :
Ou avec des générateurs:
la source
Voici d'autres versions du même qui produisent des résultats légèrement différents:
glob.iglob ()
glob.glob1 ()
fnmatch.filter ()
la source
glob1()
est une fonction d'aide dans leglob
module qui n'est pas répertoriée dans la documentation Python. Il y a des commentaires en ligne décrivant ce qu'il fait dans le fichier source, voir.../Lib/glob.py
.glob.glob1()
n'est pas public mais il est disponible sur Python 2.4-2.7; 3.0-3.2; pypy; jython github.com/zed/test_glob1glob
module.path.py est une autre alternative: https://github.com/jaraco/path.py
la source
for f in p.walk(pattern='*.txt')
go through every subfolderslist(p.glob('**/*.py'))
Python v3.5 +
Méthode rapide utilisant os.scandir dans une fonction récursive. Recherche tous les fichiers avec une extension spécifiée dans le dossier et les sous-dossiers.
Mise à jour avril 2019
Si vous recherchez dans des répertoires contenant 10 000 fichiers, l'ajout à une liste devient inefficace. «Céder» les résultats est une meilleure solution. J'ai également inclus une fonction pour convertir la sortie en un Pandas Dataframe.
la source
Python a tous les outils pour le faire:
la source
all_txt_files = list(filter(lambda x: x.endswith('.txt'), os.listdir(the_dir)))
Pour obtenir tous les noms de fichiers '.txt' dans le dossier 'dataPath' sous forme de liste de manière Pythonic:
la source
Essayez ceci, cela trouvera tous vos fichiers récursivement:
la source
**
. Uniquement disponible en python 3. Ce que je n'aime pas, c'est lachdir
partie. Pas besoin de çà.filepath = os.path.join('wallpaper')
puis l'utiliser commeglob.glob(filepath+"**/*.psd", recursive = True)
, ce qui donnerait le même résultat.la source
J'ai fait un test (Python 3.6.4, W7x64) pour voir quelle solution est la plus rapide pour un dossier, pas de sous-répertoires, pour obtenir une liste de chemins de fichiers complets pour les fichiers avec une extension spécifique.
Pour faire court, cette tâche
os.listdir()
est la plus rapide et 1,7 fois plus rapide que la suivante:os.walk()
(avec une pause!), 2,7 fois plus rapide, 3,2 fois plus rapidepathlib
queos.scandir()
et 3,3 fois plus rapide queglob
.N'oubliez pas que ces résultats changeront lorsque vous aurez besoin de résultats récursifs. Si vous copiez / collez une méthode ci-dessous, veuillez ajouter un .lower () sinon .EXT ne sera pas trouvé lors de la recherche de .ext.
Résultats:
la source
Ce code me simplifie la vie.
la source
Utilisez fnmatch: https://docs.python.org/2/library/fnmatch.html
la source
Pour obtenir un tableau de noms de fichiers ".txt" à partir d'un dossier appelé "data" dans le même répertoire, j'utilise généralement cette simple ligne de code:
la source
Je vous suggère d'utiliser fnmatch et la méthode supérieure. De cette façon, vous pouvez trouver l'un des éléments suivants:
.
la source
En voici un avec
extend()
la source
.txt
:)Solution fonctionnelle avec sous-répertoires:
la source
Dans le cas où le dossier contient beaucoup de fichiers ou si la mémoire est une contrainte, pensez à utiliser des générateurs:
Option A: répéter
Option B: Obtenez tout
la source
Une solution copiable-collable similaire à celle de ghostdog:
la source
utilisez le module Python OS pour rechercher des fichiers avec une extension spécifique.
l'exemple simple est ici:
la source
De nombreux utilisateurs ont répondu avec des
os.walk
réponses, qui incluent tous les fichiers mais aussi tous les répertoires et sous-répertoires et leurs fichiers.Ou pour un seul où vous n'avez pas besoin d'un générateur:
Si vous allez utiliser des correspondances pour autre chose, vous pouvez en faire une liste plutôt qu'une expression de générateur:
la source
Une méthode simple en utilisant la
for
boucle:Bien que cela puisse être généralisé.
la source