Necesito recorrer los subdirectorios de un directorio determinado y buscar archivos. Si obtengo un archivo, tengo que abrirlo, cambiar el contenido y reemplazarlo con mis propias líneas.
Intenté esto:
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()
pero recibo un error ¿Qué estoy haciendo mal?

Respuestas:
El recorrido real a través de los directorios funciona tal como lo ha codificado. Si reemplaza el contenido del bucle interno con una
printdeclaración simple , puede ver que se encuentra cada archivo:Si aún recibe errores al ejecutar lo anterior, proporcione el mensaje de error.
Actualizado para Python3
fuente
Otra forma de devolver todos los archivos en subdirectorios es usar el
pathlibmódulo , introducido en Python 3.4, que proporciona un enfoque orientado a objetos para manejar las rutas del sistema de archivos (Pathlib también está disponible en Python 2.7 a través del módulo pathlib2 en PyPi ):Desde Python 3.5, el
globmódulo también admite la búsqueda recursiva de archivos:El
file_listde cualquiera de los enfoques anteriores se puede repetir sin la necesidad de un bucle anidado:fuente
pathlibmí mismo, principalmente porque me gusta la sintaxis de métodos orientados a objetos. Existen otras diferencias, como la biblioteca de rutas que devuelve clases de ruta específicas en lugar de cadenas, y las funciones disponibles difieren entre las bibliotecas (por ejemplo,os.path.expanduser('~')vsPath.home()). Examine la documentación y vea qué enfoque prefiere.**el patrón global, puede usarrglob.A partir de 2020 ,
glob.iglob(path/**, recursive=True)parece la solución más pitónica , es decir:Salida:
Notas:
1 - glob.iglob
2 - Si es recursivo
True, el patrón'**'coincidirá con cualquier archivo y cero o másdirectoriesysubdirectories.3 - Si el directorio contiene archivos que comienzan con
.ellos, no coincidirán de manera predeterminada. Por ejemplo, considere un directorio que contienecard.gify.card.gif:4 - También puede usar
rglob(pattern), que es lo mismo que llamarglob()con**/agregado en frente del patrón relativo dado.fuente