Foros del Web » Programando para Internet » Python »

¿Leer la ruta correcta mediante excepciones?

Estas en el tema de ¿Leer la ruta correcta mediante excepciones? en el foro de Python en Foros del Web. Hola! Me gustaria poder configurar mi programa para poder trabajar con dos ordenadores. Se me complica, cuando el script, debe leer archivos. Ya que entonces ...
  #1 (permalink)  
Antiguo 17/05/2015, 03:38
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
¿Leer la ruta correcta mediante excepciones?

Hola!

Me gustaria poder configurar mi programa para poder trabajar con dos ordenadores. Se me complica, cuando el script, debe leer archivos. Ya que entonces la ruta de archivos cambia.

Si tenemos un PC de sobremesa y un portatil ¿Como enfocar las excepciones?

Ejemplo:

(argumento, es un archivo de texto especificado en dicha ruta)

Código Python:
Ver original
  1. def funcion(argumento):
  2.  
  3.     try:
  4.         with open('C:/Users/sobremesa/Desktop/ruta/' + argumento, 'r') as leer:
  5.             contenedor = []
  6.             for x in leer.readlines():
  7.                 corte = x.split(',')
  8.                 contenedor.append([int(j) for j in corte])
  9.              
  10.     except FileNotFoundError:
  11.         with open('C:/Users/portatil/Desktop/ruta/' + argumento, 'r') as leer:
  12.             contenedor = []
  13.             for x in leer.readlines():
  14.                 corte = x.split(',')
  15.                 contenedor.append([int(j) for j in corte])            
  16.            
  17.        
  18.     else:
  19.         print('No existe ese fichero...')
  20.         return

- Si estamos en el ordenador sobremesa, no salta la except y lee el archivo

- Si estamos en el ordenador portatil, salta la except y lee el archivo

El problema que tengo, es que el else no se ejecuta nunca. Es decir, podemos encontrarnos en un ordenador u otro, y que no exista el archivo (pero estemos en la ruta correcta). En ese caso, me gustaria que ejecutara el else.

Por otro lado, ¿No es redundante repetir el bloque de codigo entero en el try y el except? ¿Se hace de otra manera?

Gracias!
  #2 (permalink)  
Antiguo 17/05/2015, 06:42
 
Fecha de Ingreso: febrero-2011
Mensajes: 54
Antigüedad: 13 años, 8 meses
Puntos: 18
Respuesta: ¿Leer la ruta correcta mediante excepciones?

No tengo ni idea de si os.getenv() funcionará en windows.
De todas maneras puedes poner una clausula if dentro de try.

Código Python:
Ver original
  1. import os
  2. home = os.getenv('HOME')
  3.  
  4. try:
  5.     if os.path.exists(home + '/x'):
  6.         with open(home + '/x') as leer:
  7.             print leer.readline()
  8.     else:
  9.         with open(home + '/y') as leer:
  10.             print leer.readline()
  11. except IOError:
  12.     print('No existe ese fichero...')

Saludos.
  #3 (permalink)  
Antiguo 17/05/2015, 09:24
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: ¿Leer la ruta correcta mediante excepciones?

Ok.

Pero dandole vueltas al asunto, ¿No de podria solucionar con un IF, ELIF y ELSE?

Asi:

Código Python:
Ver original
  1. def funcion(archivo):
  2.     if os.path.exists('C:/Users/sobremesa/Desktop/carpeta/' + archivo):
  3.         with open('C:/Users/sobremesa/Desktop/carpeta/' + archivo, 'r') as leer:
  4.             contenedor = []
  5.             for x in leer.readlines():
  6.                 corte = x.split(',')
  7.                 contenedor.append([int(j) for j in corte])
  8.              
  9.     elif os.path.exists('C:/Users/portatil/Desktop/carpeta/' + archivo):
  10.         with open('C:/Users/portatil/Desktop/carpeta/' + archivo, 'r') as leer:
  11.             contenedor = []
  12.             for x in leer.readlines():
  13.                 corte = x.split(',')
  14.                 contenedor.append([int(j) for j in corte])
  15.     else:            
  16.         print('No existe el fichero...') # se cumple si no existe el fichero en el PC o el Portatil
  17.         return

La cosa esta, en que veo demasiado codigo para algo tan simple. El primer IF representa el ordenado o PC de sobremesa. El ELIF, es el ordenador portatil. El ELSE, se cumple si en alguno de los dos ordenadores, no existe el fichero. Seria como un EXCEPT.

¿Como saber si es mejor la combinacion IF...ELIF...ELSE o TRY...EXCEPT?
  #4 (permalink)  
Antiguo 18/05/2015, 11:27
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Leer la ruta correcta mediante excepciones?

Try en general es más lento que un if, porque try necesita crear un estado especial en la ejecución, de tal manera que ciertos datos estén disponibles en el momento de capturar excepciones. Sin embargo, en Python no es tan oneroso como lo es en otros lenguajes, como Java.
Es importante tener en cuenta que todos los lenguajes tienen sus construcciones recomendadas y sus guías de estilo. try/except donde en otros lenguajes se usaría if/else es algo normal y hasta recomendado por la documentación de python (es lo que en inglés se llama "idiom"), con lo cual es razonable suponer que su rendimiento y eficiencia tienda a aumentar con el tiempo, a medida que el lenguaje avanza.

En muchos casos, try es más eficiente que if, porque cuando hablamos de if en realidad no nos referimos simplemente a if, sino a que hacemos if con alguna operación que devuelve un valor binario. Por ejemplo:
Código Python:
Ver original
  1. try:
  2.     quinta_letra = cadena[4]
  3. except KeyError:
  4.     print 'cadena no tiene al menos 5 caracteres'
sea probablemente más eficiente, en Python al menos, que
Código Python:
Ver original
  1. if len(cadena)>4:
  2.     quinta_letra = cadena[4]
Al menos en los casos donde sabemos que cadena tendrá casi siempre más de 4 caracteres (con lo cual la excepción no se lanzará frecuentemente), ya que evitamos tener que calcular el largo de cadena y compararlo cada vez.

Hay mucha información al respecto en internet, incluyendo comparativas de rendimiento y advertencias sobre cuándo vale la pena usar un método u otro, por ejemplo:

http://stackoverflow.com/questions/7...possible-first


En este caso puntual, en mi opinión lo mejor sería algo como esto, si fueses a usar try:
Código Python:
Ver original
  1. ruta_portatil = '...'
  2. ruta_sobremesa = '...'
  3.  
  4. try:
  5.     archivo = open(ruta_portatil)
  6. except FileNot FoundError:
  7.     archivo = open(ruta_sobremesa)
  8.  
  9. with archivo:
  10.     # lo que sea que debas hacer con el archivo
o, con if
Código Python:
Ver original
  1. if os.path.exists(ruta_portatil):
  2.     archivo = open(ruta_portatil)
  3. else:
  4.     archivo = open(ruta_sobremesa)
  5.  
  6. with archivo:
  7.     # lo que sea que debas hacer


Saludos.

Última edición por AlvaroG; 18/05/2015 a las 11:34
  #5 (permalink)  
Antiguo 18/05/2015, 12:26
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: ¿Leer la ruta correcta mediante excepciones?

Muchas gracias por la explicación. En todo caso, en tu ejemplo, deberia poner el alias en el with ¿No?

Código Python:
Ver original
  1. with archivo as leer:

Última edición por Koan; 18/05/2015 a las 12:32
  #6 (permalink)  
Antiguo 19/05/2015, 09:48
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: ¿Leer la ruta correcta mediante excepciones?

Pues no es estrictamente necesario el "as leer", ya que en este caso estás usando "with" con una variable, con lo que ya tenés una forma de acceder a los métodos y propiedades de "archivo"
  #7 (permalink)  
Antiguo 19/05/2015, 11:34
 
Fecha de Ingreso: diciembre-2009
Ubicación: Spain
Mensajes: 180
Antigüedad: 14 años, 11 meses
Puntos: 9
Respuesta: ¿Leer la ruta correcta mediante excepciones?

Cita:
Iniciado por AlvaroG Ver Mensaje
Pues no es estrictamente necesario el "as leer", ya que en este caso estás usando "with" con una variable, con lo que ya tenés una forma de acceder a los métodos y propiedades de "archivo"
Pues tienes toda la razon del mundo. Como lo has puesto tu, la variable 'archivo' es una instancia del open. Es verdad...todo en Python es un objeto ;)

Gracias de nuevo!

Etiquetas: correcta, funcion, mediante, programa, ruta
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 08:16.