J'ai besoin de parcourir les sous-répertoires d'un répertoire donné et de rechercher des fichiers. Si j'obtiens un fichier, je dois l'ouvrir, changer le contenu et le remplacer par mes propres lignes.
J'ai essayé ceci:
import os
rootdir ='C:/Users/sid/Desktop/test'
for subdir, dirs, files in os.walk(rootdir):
for file in files:
f=open(file,'r')
lines=f.readlines()
f.close()
f=open(file,'w')
for line in lines:
newline = "No you are not"
f.write(newline)
f.close()
mais j'obtiens une erreur. Qu'est-ce que je fais mal?
Réponses:
Le parcours réel des répertoires fonctionne comme vous l'avez codé. Si vous remplacez le contenu de la boucle interne par une simple
print
instruction, vous pouvez voir que chaque fichier est trouvé:Si vous obtenez toujours des erreurs lors de l'exécution de ce qui précède, veuillez fournir le message d'erreur.
Mis à jour pour Python3
la source
Une autre façon de renvoyer tous les fichiers dans les sous-répertoires est d'utiliser le
pathlib
module , introduit dans Python 3.4, qui fournit une approche orientée objet pour gérer les chemins du système de fichiers (Pathlib est également disponible sur Python 2.7 via le module pathlib2 sur PyPi ):Depuis Python 3.5, le
glob
module prend également en charge la recherche récursive de fichiers:L'une
file_list
ou l'autre des approches ci-dessus peut être répétée sans avoir besoin d'une boucle imbriquée:la source
pathlib
moi-même, principalement parce que j'aime la syntaxe des méthodes orientées objet. Il existe d'autres différences, telles que la bibliothèque de chemins renvoie des classes de chemins spécifiques plutôt que des chaînes, et les fonctions disponibles diffèrent entre les bibliothèques (par exempleos.path.expanduser('~')
vsPath.home()
). Parcourez la documentation et voyez quelle approche vous préférez.**
le modèle glob, vous pouvez utiliserrglob
.Dès 2020 ,
glob.iglob(path/**, recursive=True)
semble la solution la plus pythonique , à savoir:Production:
Remarques:
1 - glob.iglob
2 - Si récursif est
True
, le modèle'**'
correspondra à tous les fichiers et zéro ou plusdirectories
etsubdirectories
.3 - Si le répertoire contient des fichiers commençant par,
.
ils ne seront pas mis en correspondance par défaut. Par exemple, considérons un répertoire contenantcard.gif
et.card.gif
:4 - Vous pouvez également utiliser
rglob(pattern)
, ce qui équivautglob()
à appeler avec**/
ajouté devant le modèle relatif donné.la source