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.