¿Realiza una búsqueda y reemplazo en todos los archivos de una carpeta a través de python?

Me gustaría aprender a usar Python como un reemplazo de la línea de comandos. Pasé un tiempo con python en el pasado, pero ha sido un tiempo. Esto parece estar dentro de su scope.

Tengo varios archivos en una carpeta en los que quiero hacer una búsqueda y reemplazo, dentro de todos ellos. Me gustaría hacerlo con un script de python.

Por ejemplo, busque y reemplace todas las instancias de ” foo ” con ” foobar “.

Bienvenido a StackOverflow. Como quieres aprender por ti mismo (+1), solo te daré algunos consejos.

Echa un vistazo a os.walk() para obtener todos los archivos.

Luego itere sobre cada línea en los archivos ( for line in currentfile: aquí es útil).

Ahora necesita saber si desea un reemplazo “estúpido” (busque / reemplace cada foo incluso si está en el medio de una palabra (por ejemplo, foobar – ¿quiere un foofoobar como resultado?) O un reemplazo inteligente.

Para el primero, mire a str.replace() , para el último, mire re.sub() y averigüe qué significa r'\bfoo\b' .

Normalmente yo saco el antiguo perl -pi -e 's/foo/foobar/' para esto, pero si quieres Python:

 import os import re _replace_re = re.compile("foo") for dirpath, dirnames, filenames in os.walk("directory/"): for file in filenames: file = os.path.join(dirpath, file) tempfile = file + ".temp" with open(tempfile, "w") as target: with open(file) as source: for line in source: line = _replace_re.sub("foobar", line) target.write(line) os.rename(tempfile, file) 

Y si está en Windows, deberá agregar un os.remove(file) antes del os.rename(tempfile, file) .

Lo resolví y esto parece funcionar, pero cualquier error que se pueda señalar sería asombroso.

 import fileinput, sys, os def replaceAll(file, findexp, replaceexp): for line in fileinput.input(file, inplace=1): if findexp in line: line = line.replace(findexp, replaceexp) sys.stdout.write(line) if __name__ == '__main__': files = os.listdir("c:/testing/") for file in files: newfile = os.path.join("C:/testing/", file) replaceAll(newfile, "black", "white") 

una expansión en esto sería pasar a las carpetas dentro de las carpetas.

esta es una alternativa, ya que tiene varias soluciones de Python presentadas. La utilidad más útil (según mi opinión), en Unix / Windows, es el comando GNU find y las herramientas de reemplazo como sed / awk. para buscar archivos (recursivamente) y hacer el reemplazo, un comando simple como este hace el truco (la syntax viene de la memoria y no está probada). esto dice que busque todos los archivos de texto y cambie la palabra “viejo” a “nuevo” en su contenido, al mismo tiempo, use sed para hacer una copia de seguridad de los archivos originales …

 $ find /path -type f -iname "*.txt" -exec sed -i.bak 's/old/new/g' "{}" +;