Python: Comment puis-je trouver tous les fichiers avec une extension particulière?
Je suis en train d'essayer de trouver toutes les .c
les fichiers dans un répertoire à l'aide de Python.
J'ai écrit cela, mais il est juste de retour moi tous les fichiers - pas seulement .c
fichiers.
import os
import re
results = []
for folder in gamefolders:
for f in os.listdir(folder):
if re.search('.c', f):
results += [f]
print results
Comment puis-je obtenir le .c
fichiers?
- Apprendre regex de caractères spéciaux; dot
.
correspond à presque n'importe quoi (les sauts de ligne en option). docs.python.org/library/re.html#regular-expression-syntax - Je pense que votre regExp besoin d'une légère modification, quelque chose comme
code
si re.recherche('.*\.$ c', f):code
Vous devez vous connecter pour publier un commentaire.
essayez de changer la boucle interne à quelque chose comme ceci
results += [each for each in os.listdir(folder) if each.endswith(
.c`)].Essayer "glob":
glob
est un peu exagéré aussi ( voir @Jive de commentaire ci-dessous ). Je ne sais pas assez sur le fonctionnement interne deglob
commentaires sur cela.glob
utilise également des regex plusos.listdir()
- ainsi que de nombreux générateurs, des appels de fonctions, récursivité, si/d'autre os.chemin d'accès.split + rejoindre ... Alors sa lente, mais simple d'utilisation, si vous avez besoin du chemin complet de toute façon. Étrange: sur Windows en interne posixmodule.c utiliseFileFindFirstW/NextW("directory\\*.*")
pouros.listdir("directory")
🙂 d'envisager dewin32api.FindFiles('directory/*.c')]
sur Windows pour la vitesse.BAISER
os.walk
comme il semble être assez lente.Pour une autre alternative, vous pouvez utiliser fnmatch
ou avec une compréhension de liste:
ou à l'aide de filtre:
Il est une meilleure solution que directement à l'aide d'expressions régulières, c'est la bibliothèque standard du module
fnmatch
pour traiter les modèles de nom de fichier. (Voir aussiglob
module.)Écrire une fonction d'aide:
et de l'utiliser comme suit:
"^.*?\.c$"
. Serait'[.].c$
ne pas être suffisant comme @Vatine a suggéré?.c
fichiers dans undirectory
. Sont vos extensions de fichier en majuscules, par hasard? Dans ce cas, vous aurez besoin d'utiliser lare.I
drapeau lors de la compilation de l'expression régulière.'[.].c$
serait effectivement suffisant. J'ai simplement re-utilisé une expression à partir d'un script que j'avais écrit pour un autre type de fichier.La mise en œuvre de shutil.copytree est dans les docs. Je mofdified de prendre une liste d'extensions à INCLURE.
Utilisation: Par exemple, pour copier uniquement .config et .les fichiers bat....
Modifier le répertoire dans le chemin d'accès donné, de sorte que vous pouvez rechercher des fichiers dans le répertoire. Si vous ne modifiez pas le répertoire puis ce code permet de rechercher des fichiers dans votre répertoire:
c'est assez propre.
les commandes viennent de l'os de la bibliothèque.
ce code effectue une recherche dans le répertoire de travail en cours et la liste uniquement le type de fichier spécifié. Vous pouvez changer cela en remplaçant 'os.getcwd()' avec votre répertoire cible et choisissez le type de fichier en remplaçant " (ext)'. os.fsdecode est si vous n'obtenez pas une bytewise erreur de .endswith(). ceci est également trie par ordre alphabétique, vous pouvez supprimer triés() pour les premières de la liste.
.c
fichiers, pas.vtt
.Si vous remplacez
'.c'
avec'[.]c$'
, vous êtes à la recherche pour les fichiers qui contiennent.c
que les deux derniers caractères du nom, plutôt que tous les fichiers qui contiennent unc
, avec au moins un caractère avant.Modifier: Sinon, match
f[-2:]
avec'.c'
, ce qui PEUT être mathématiquement moins cher que de sortir un regexp match.Juste pour être clair, si vous voulez que le point le personnage de votre terme de recherche, vous pourriez avoir échappé: les
'.*[barre oblique].c " serait vous donner ce dont vous avez besoin, de plus, vous devez utiliser quelque chose comme:
résultats.append(f), au lieu de ce que vous avait indiqué que les résultats += [f]
Cette fonction renvoie une liste de tous les noms de fichiers avec l'extension spécifiée qui vivent dans le répertoire spécifié:
Si vous voulez la liste de tous les fichiers avec l'extension spécifiée dans un certain répertoire et de ses sous-répertoires que vous pouvez faire: