Remplacer des chaînes de caractères dans les fichiers en Python
Comment pouvez-vous remplacer le match avec la donnée de remplacement de façon récursive dans un répertoire et ses sous-répertoires?
Pseudo-code
import os
import re
from os.path import walk
for root, dirs, files in os.walk("/home/noa/Desktop/codes"):
for name in dirs:
re.search("dbname=noa user=noa", "dbname=masi user=masi")
// I am trying to replace here a given match in a file
Marteaux pour les clous, les vis pour le tournevis. Si vous avez vraiment besoin d'un peu d'accent sur l'efficacité, Perl est l'outil parfait pour ce travail. Ne pas dire "ne pas utiliser Python," mais pensez à vos exigences.
Chris: je sais Perl, mais je veux savoir Python aussi.
Perl? Que diriez -
Chris: je sais Perl, mais je veux savoir Python aussi.
Perl? Que diriez -
find
et xargs
?OriginalL'auteur Léo Léopold Hertz 준영 | 2009-10-20
Vous devez vous connecter pour publier un commentaire.
Mettre tout ce code dans un fichier appelé
mass_replace
. Sous Linux ou Mac OS X, vous pouvez le fairechmod +x mass_replace
et puis il suffit de l'exécuter. Sous Windows, vous pouvez l'exécuter avecpython mass_replace
suivi par les arguments appropriés.EDIT: j'ai changé le code ci-dessus à partir de l'original de la réplique. Il y a plusieurs changements. Tout d'abord,
mass_replace()
appelle maintenantre.compile()
de pré-compiler le modèle de recherche; en second lieu, de vérifier que l'extension du fichier, nous passons maintenant à un n-uplet des extensions de fichier à.endswith()
plutôt que d'appeler.endswith()
trois fois; en troisième lieu, il utilise maintenant lawith
instruction disponible dans les dernières versions de Python; et enfin,file_replace()
vérifie pour voir si le motif est trouvé dans le fichier, et de ne pas réécrire le fichier si le motif n'est pas trouvé. (L'ancienne version de la réécrire pour chaque fichier, la modification de la date-heure, même si le fichier de sortie est identique au fichier d'entrée; c'était inélégant.)EDIT: j'ai changé ce par défaut en remplaçant chaque fichier, mais avec une ligne vous pouvez modifier la limiter à des extensions spécifiques. Je pense que le remplacement de tous les fichiers est plus utile out-of-the-box par défaut. Cela pourrait être étendu avec une liste des extensions ou des noms de fichiers à ne pas toucher, les options pour le rendre insensible à la casse, etc.
EDIT: Dans un commentaire, @asciimo signalé un bug. J'ai édité ce pour corriger le bug.
str.endswith()
est documenté pour accepter un tuple de cordes pour essayer, mais pas une liste. Fixe. Aussi, j'ai fait une couple de fonctions acceptent un argument optionnel pour vous permettre de passer un tuple de ses extensions; il devrait être assez facile de le modifier pour accepter un argument de ligne de commande pour spécifier les extensions.Dans
file_replace
j'ai dû changeros.rename
àshutil.move
pour que cela fonctionne pour moi sous Windows.Sur mon système (python 2.7.5), j'ai eu
TypeError: endswith first arg must be str, unicode, or tuple, not list
. La modification de la liste à un n-uplet a travaillé par exemple[".fudge", "pancake"]
->(".fudge", "pancake")
.je vous remercie pour cette. D'habitude je suis bon sur les tests de code avant de le poster ici, mais je pense que j'ai été bâclée quand j'ai écrit ça! Fixe maintenant.
Deux correctifs pour Windows: 1) Unindent
os.rename(out_fname, fname)
de sorte qu'il est à l'extérieur de lawith
portée. 2) faire Précéder cette ligne avecos.remove(fname)
de sorte querename()
réussit.OriginalL'auteur steveha
Avez-vous vraiment besoin d'expressions régulières?
Est-ce que "root" ici signifie vraiment le niveau le plus bas de la hiérarchie de répertoire? Ou est-ce seulement une variable à un endroit où vous pouvez stocker le Chemin d'accès à la recherche?
est juste un nom de paramètre, le niveau le plus bas répertoire à la recherche commence à partir. vous pouvez l'appeler comme vous le souhaitez
OriginalL'auteur kurosch
Bien sûr, si vous voulez juste pour obtenir fait sans codage, trouver et xargs:
(Et vous pourriez probablement faire cela avec des find -exec ou de quelque chose d'aussi bien, mais je préfère xargs.)
OriginalL'auteur retracile
C'est comment je pourrais trouver et remplacer des chaînes dans des fichiers à l'aide de python. C'est une simple fonction de recherche de manière récursive un des répertoires pour une chaîne de caractères et de la remplacer par une chaîne. Vous pouvez également limiter les fichiers avec une certaine extension de fichier comme dans l'exemple ci-dessous.
Cela permet de faire quelque chose comme:
OriginalL'auteur David Sulpy
cela devrait fonctionner:
Bienvenue sur Stackoverflow! Vous pouvez modifier votre réponse en cliquant sur
edit
au bas du corps de votre question. S'il vous plaît, voir si la modification est correcte. J'aime votrewith open("namelist.wps", 'r') as readf
qui est beaucoup plus claire que la rupture de la chose à deux lignes. La dernière boucle for est également clair. De très bons ajouts!OriginalL'auteur Nepomuzem