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
print
declaració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
pathlib
mó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
glob
módulo también admite la búsqueda recursiva de archivos:El
file_list
de cualquiera de los enfoques anteriores se puede repetir sin la necesidad de un bucle anidado:fuente
pathlib
mí 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ásdirectories
ysubdirectories
.3 - Si el directorio contiene archivos que comienzan con
.
ellos, no coincidirán de manera predeterminada. Por ejemplo, considere un directorio que contienecard.gif
y.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