Foros del Web » Programando para Internet » Python »

os.walk

Estas en el tema de os.walk en el foro de Python en Foros del Web. Buenas tengo un problema tengo esta variable que hace un recorrido en una carpeta: @import url("http://static.forosdelweb.com/clientscript/vbulletin_css/geshi.css"); Código Python: Ver original text = next ( os ...
  #1 (permalink)  
Antiguo 17/01/2012, 13:40
 
Fecha de Ingreso: octubre-2011
Mensajes: 31
Antigüedad: 13 años, 2 meses
Puntos: 7
os.walk

Buenas tengo un problema tengo esta variable que hace un recorrido en una carpeta:
Código Python:
Ver original
  1. text = next(os.walk("/home/name"))[1]
y utilizo esos nombres de carpetas como variables.

El problema que dentro del código tengo una parte que crea nuevas carpetas dentro de esa dirección. Pero la variable text no las guarda porque solo hace el recorrido al principio, como haría para que el recorriera cada cierto tiempo esa dirección por si hay nuevas carpetas sin necesidad de salir del código y volver a entrar Gracias.
  #2 (permalink)  
Antiguo 17/01/2012, 14:18
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: os.walk

Una solución podría ser añadir a text las carpetas que vas creando.

Otra opción es obtener las carpetas cada vez que se requiera.
  #3 (permalink)  
Antiguo 17/01/2012, 14:51
 
Fecha de Ingreso: octubre-2011
Mensajes: 31
Antigüedad: 13 años, 2 meses
Puntos: 7
Respuesta: os.walk

no podría agregar las carpetas que voy creando porque no se que nombre va a llevar la carpeta que va crear la persona... lo trate de hacer de esta forma agregando la variable que contiene el nombre de la carpeta que es "nombre_carp"...
Código Python:
Ver original
  1. text = next(os.walk('/home/name'+nombre_carp.get_text()))[1]

pero cuando trato de ver que contiene la variable text que esta dentro de un gtk.combo_box_new_text() me muestra solo el primer recorrido... que es lo que existe en la dirección.

yo lo que necesito es que si yo creo una carpeta en esa dirección me la muestre en el gtk.combo sin necesidad de cerrar la gui que se actualice esa variable text automáticamente para luego mostrarla en el gtk.combo... pero sin cerrar la gui..
  #4 (permalink)  
Antiguo 18/01/2012, 09:26
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: os.walk

no debería ser necesario "cerrar la GUI" para actualizar el valor de un combobox

Además, ¿realmente estás haciendo un recorrido recursivo de la carpeta, o solamente estás obteniendo nombres de directorios? ¿no sería mejor usar glob?


Saludos.
  #5 (permalink)  
Antiguo 19/01/2012, 10:36
 
Fecha de Ingreso: octubre-2011
Mensajes: 31
Antigüedad: 13 años, 2 meses
Puntos: 7
Respuesta: os.walk

Este es el código de ejemplo... hay un entry donde se coloca el nombre de la carpeta... un botón para crearla.. y el combo que muestra todo lo que esta en esa dirección.... pero cuando creo un nueva carpeta no me la muestra en el combo a menos que me salga y vuela entrar al programa.... como aria que en el combo saliera el nombre de la carpeta que estoy creando sin necesidad de salir de programa y volver a entrar...

Código Python:
Ver original
  1. #!/bin/python/ env
  2.  
  3. import gtk
  4. import os
  5.  
  6. def combo_boton(homogeneous, spacing, expand, fill, padding):
  7.    
  8.    
  9.     caja = gtk.HBox(homogeneous, spacing)
  10.     caja.set_border_width(10)
  11.     def crear_carpeta(self, data=None):
  12.         systema = os.system('mkdir /home/carlos/'+texto.get_text())
  13.    
  14.     text = next(os.walk('/home/carlos/'))[1]
  15.  
  16.     combo = gtk.combo_box_new_text()
  17.     for t in text:
  18.         combo.append_text(t)
  19.    
  20.     texto = gtk.Entry()
  21.     texto.set_text("nombre-de-la-carpta")
  22.     texto.connect("activate", crear_carpeta)
  23.    
  24.     boton = gtk.Button("Crear Carpeta")
  25.     boton.connect("clicked", crear_carpeta)
  26.    
  27.    
  28.     caja.pack_start(combo, False, False,5)
  29.     combo.show()
  30.     caja.pack_start(texto, False, False, 5)
  31.     texto.show()
  32.     caja.pack_start(boton, True, True, 5)
  33.     boton.show()
  34.     return caja
  35.  
  36. class PackBox1:
  37.        
  38.    def __init__(self):
  39.        
  40.        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  41.      
  42.        self.window.set_title("ejemplo")
  43.        self.window.set_border_width(10)
  44.        self.window.set_size_request(500, 100)
  45.        self.window.set_resizable(False)
  46.        
  47.        box1 = gtk.VBox(gtk.FALSE, 0)
  48.        
  49.        box2 = combo_boton(gtk.FALSE, 0, gtk.FALSE, gtk.FALSE,0)
  50.        box1.pack_start(box2, gtk.FALSE, gtk.FALSE, 0)
  51.        box2.show()
  52.            
  53.        box1.show()
  54.        self.window.add(box1)
  55.        self.window.show()
  56.          
  57. def main():
  58.     gtk.main()
  59.     return 0
  60.  
  61. if __name__ =="__main__":
  62.     packbox1 = PackBox1()
  63.     main()
  #6 (permalink)  
Antiguo 19/01/2012, 11:55
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: os.walk

Código Python:
Ver original
  1. import gtk
  2. import os
  3.  
  4. text = []
  5.  
  6. class PackBox1:
  7.        
  8.     def __init__(self):
  9.         self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
  10.        
  11.         self.window.set_title("ejemplo")
  12.         self.window.set_border_width(10)
  13.         self.window.set_size_request(500, 100)
  14.         self.window.set_resizable(False)
  15.         self.window.connect('destroy', gtk.main_quit)
  16.        
  17.         box1 = gtk.VBox(gtk.FALSE, 0)
  18.        
  19.         caja = gtk.HBox(gtk.FALSE, 0)
  20.         caja.set_border_width(10)
  21.        
  22.        
  23.         self.combo = gtk.combo_box_new_text()
  24.         self.actualizar_combo()
  25.        
  26.         self.texto = gtk.Entry()
  27.         self.texto.set_text("nombre-de-la-carpta")
  28.         self.texto.connect("activate", self.crear_carpeta)
  29.        
  30.         boton = gtk.Button("Crear Carpeta")
  31.         boton.connect("clicked", self.crear_carpeta)
  32.        
  33.        
  34.         caja.pack_start(self.combo, False, False,5)
  35.         self.combo.show()
  36.         caja.pack_start(self.texto, False, False, 5)
  37.         self.texto.show()
  38.         caja.pack_start(boton, True, True, 5)
  39.         boton.show()
  40.        
  41.         box1.pack_start(caja, gtk.FALSE, gtk.FALSE, 0)
  42.         caja.show()
  43.              
  44.         box1.show()
  45.         self.window.add(box1)
  46.         self.window.show()
  47.        
  48.     def actualizar_combo(self):
  49.         model = self.combo.get_model()
  50.         self.combo.set_model(None)
  51.         self.ruta = os.path.expanduser("~")
  52.         text = next(os.walk(self.ruta))[1]
  53.         model.clear()
  54.         for t in text:
  55.             model.append([t])
  56.         self.combo.set_model(model)
  57.        
  58.    
  59.     def crear_carpeta(self, data=None):
  60.         self.ruta = os.path.expanduser("~")
  61.         self.ruta = os.path.join(self.ruta, self.combo.get_active_text())
  62.         self.ruta = os.path.join(self.ruta, self.texto.get_text())
  63.         systema = os.system('mkdir ' + self.ruta)
  64.        
  65.  
  66. if __name__ =="__main__":
  67.     packbox1 = PackBox1()
  68.     gtk.main()
Creo que mas o menos quiere algo así
  #7 (permalink)  
Antiguo 19/01/2012, 12:04
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: os.walk

Como pensé, estás usando os.walk() como una forma de leer los directorios de la carpeta.

Sería mejor usar un método creado para eso:

Código Python:
Ver original
  1. carpetas = (dir for dir in os.listdir('/home/carlos') if os.path.isdir(dir))

Pero bueno, tu problema no tiene absolutamente nada que ver con os.walk. Lo que no estás haciendo es decirle al combobox que debe actualizarse.


Lo que tenés que hacer es agregar código a la función que crea la carpeta para que haga que el combo se regenere. No me atrevo a enviarte el código correspondiente dadas las muchas desprolijidades de tu código actual:

- la forma en la que obtenés la lista de directorios
- pones una función dentro de otra (crear_carpeta dentro de combo_boton)
- creación e inicialización del combo en la misma función que el código que lo inserta en la ventana, y que conecta sus señales a otros elementos.


Saludos.


Edito: razpeitia, me has ganado otra vez. Igual creo que nuestras respuestas son diferentes :)
  #8 (permalink)  
Antiguo 19/01/2012, 12:54
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: os.walk

Solo para agregar, cuando usas os.system y le añades la ruta esta no va a funcionar cuando tengas espacios. La recomendación es usar subprocess
  #9 (permalink)  
Antiguo 19/01/2012, 12:56
 
Fecha de Ingreso: octubre-2011
Mensajes: 31
Antigüedad: 13 años, 2 meses
Puntos: 7
Respuesta: os.walk

Razpeitia en el código que me mandaste cuando trato de crear la carpeta me tira ese error en el terminal... :S T_T

Código CODE:
Ver original
  1. Traceback (most recent call last):
  2.   File "prueba.py", line 61, in crear_carpeta
  3.     self.ruta = os.path.join(self.ruta, self.combo.get_active_text())
  4.   File "/usr/lib/python2.6/posixpath.py", line 65, in join
  5.     if b.startswith('/'):
  6. AttributeError: 'NoneType' object has no attribute 'startswith'
  #10 (permalink)  
Antiguo 19/01/2012, 14:27
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 9 meses
Puntos: 1360
Respuesta: os.walk

Si tienes que validar que self.combo.get_active_text() no sea None o sea que el usuario haya seleccionado algo.
  #11 (permalink)  
Antiguo 19/01/2012, 14:44
 
Fecha de Ingreso: octubre-2011
Mensajes: 31
Antigüedad: 13 años, 2 meses
Puntos: 7
Respuesta: os.walk

mmmm bueno muchas gracias de todos modos me fue de mucha ayuda su ejemplo...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 09:16.