Saltar al contenido

Python: forma de buscar y reemplazar recursivamente string en archivos de texto

Este grupo especializado despúes de ciertos días de investigación y de recopilar de información, encontramos la solución, queremos que todo este artículo sea de gran utilidad en tu trabajo.

Solución:

os.walk es genial. Sin embargo, parece que necesita archivar tipos de archivos (lo cual sugeriría si va a recorrer algún directorio). Para hacer esto, debe agregar import fnmatch.

import os, fnmatch
def findReplace(directory, find, replace, filePattern):
    for path, dirs, files in os.walk(os.path.abspath(directory)):
        for filename in fnmatch.filter(files, filePattern):
            filepath = os.path.join(path, filename)
            with open(filepath) as f:
                s = f.read()
            s = s.replace(find, replace)
            with open(filepath, "w") as f:
                f.write(s)

Esto le permite hacer algo como:

findReplace("some_dir", "find this", "replace with this", "*.txt")

Echa un vistazo a os.walk:

import os
replacement = """some
multi-line string"""
for dname, dirs, files in os.walk("some_dir"):
    for fname in files:
        fpath = os.path.join(dname, fname)
        with open(fpath) as f:
            s = f.read()
        s = s.replace("$replace", replacement)
        with open(fpath, "w") as f:
            f.write(s)

La solución anterior tiene fallas, como el hecho de que abre literalmente todos los archivos que encuentra, o el hecho de que cada archivo se lee por completo en la memoria (lo que sería malo si tuviera un archivo de texto de 1 GB), pero debería ser una buena punto de partida.

También puede consultar el módulo re si desea realizar una búsqueda/reemplazo más compleja que buscar un elemento específico. string.

Para aquellos que usan Pitón 3.5+ ahora puede usar un glob recursivamente con el uso de ** y el recursive bandera.

Aquí hay un ejemplo reemplazando hello con world para todos .txt archivos:

for filepath in glob.iglob('./**/*.txt', recursive=True):
    with open(filepath) as file:
        s = file.read()
    s = s.replace('hello', 'world')
    with open(filepath, "w") as file:
        file.write(s)

Ten en cuenta difundir esta sección si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *