Discussion:
Cómo reemplazar el \ por / en una ruta?
Raúl Morales
2007-10-15 01:17:19 UTC
Permalink
Hola a todos:

Estoy intentando reemplazar el caracter \ que esta dentro de una ruta por un
/, el problema es que no se como poner el backslash en el replace. Hago algo
como esto:
ruta = ruta.replace("\\", "/"), pero el problema es que reemplaza solo donde
encuentre un doble backslash ' \\', y como no puedo hacer un .replace(' \',
'/') porque toma el (' \) como caracter de escape, es decir, el problema es
que no reemplaza un solo ' \' por el '/ '. He intentado de muchas formas,
pero si hago algo como ruta = ruta.replace(chr(92), '/') el caracter 92 del
ascii, igual lo toma como ' \\', como por mostar una de las formas que he
intentado. En la web solo he encontrado que para imprmir el \, basta con
hacer por ejemplo >>>print "\\"
\
pero esto no me sirve para lo que necesito.

Este "problemita" se me ha presentado intentado abrir una imagen, hacerle
un resize y guardala con el mismo nombre.

#Estoy utilizando PIL para manejar imagenes.
# import Image

La ruta que me retorna el GetPath() ( ruta = dlg.GetPath() )de un
FileDialog al imprimirla es algo como
"E:\Proyecto\Codigo\foto.bmp"

pero cuando intento hacer el Image.open(ruta), en el codigo fuente me sale
el siguiente error:
(Este es otro error que inicialmente creo que es resultado del primero)
AttributeError: type object 'Image' has no attribute 'open'

lo extraño es que si lo hago desde el interprete, ahi si abriria la imagen
si no fuera porque saca un error diciendo que no existe el archivo o la ruta
especificada, pero si cambio los \ por /, entonces todo funciona (en el
interprete).

Espero alguien me pueda ayudar de cualquier manera con esto, he buscado
mucho, pero no paso de encontrar solo como imprimir el \.

Saludos.
Ramiro Morales
2007-10-15 01:30:47 UTC
Permalink
Post by Raúl Morales
Estoy intentando reemplazar el caracter \ que esta dentro de una ruta por un
/, el problema es que no se como poner el backslash en el replace. Hago algo
ruta = ruta.replace("\\", "/"), pero el problema es que reemplaza solo donde
encuentre un doble backslash ' \\', y como no puedo hacer un .replace(' \',
'/') porque toma el (' \) como caracter de escape, es decir, el problema es
que no reemplaza un solo ' \' por el '/ '.
Probá con replace(r'\', '/')

Suerte.
--
Ramiro Morales
yaco
2007-10-15 01:46:36 UTC
Permalink
Post by Ramiro Morales
Post by Raúl Morales
Hago algo
ruta = ruta.replace("\\", "/"),
[...]
Post by Ramiro Morales
Probá con replace(r'\', '/')
las cadenas crudas de caracteres (suena genial!) o 'raw strings' no
Post by Ramiro Morales
Post by Raúl Morales
print r'\'
File "<stdin>", line 1
print r'\'
^
SyntaxError: EOL while scanning single-quoted string

de todas maneras, si pudieran, r'\' == '\\', que es lo que ya había probado.

yaco\
--
música es silencio vestido.
http://yaco.net/
yaco
2007-10-15 01:42:06 UTC
Permalink
hola!
Post by Raúl Morales
Estoy intentando reemplazar el caracter \ que esta dentro de una ruta
por un /, el problema es que no se como poner el backslash en el
ruta = ruta.replace("\\", "/"), pero el problema es que reemplaza solo
donde encuentre un doble backslash ' \\', y como no puedo hacer un
.replace(' \', '/') porque toma el (' \) como caracter de escape, es
decir, el problema es que no reemplaza un solo ' \' por el '/ '. He
intentado de muchas formas, pero si hago algo como ruta =
ruta.replace(chr(92), '/') el caracter 92 del ascii, igual lo toma como
' \\', como por mostar una de las formas que he intentado.
ruta = r"E:\Proyecto\Codigo\foto.bmp"
print ruta
E:\Proyecto\Codigo\foto.bmp
Post by Raúl Morales
ruta
'E:\\Proyecto\\Codigo\\foto.bmp'
Post by Raúl Morales
ruta.replace("\\", "/")
'E:/Proyecto/Codigo/foto.bmp'

fijate que para que no se meta con las barras el string lo definí como
'raw', usando una 'r' antes del mismo, ej: r'hola\ mundo' va a mantener
la barra en su lugar, y no interpretarla como un escape.
Post by Raúl Morales
Este "problemita" se me ha presentado intentado abrir una imagen,
hacerle un resize y guardala con el mismo nombre.
#Estoy utilizando PIL para manejar imagenes.
# import Image
La ruta que me retorna el GetPath() ( ruta = dlg.GetPath() )de un
FileDialog al imprimirla es algo como
"E:\Proyecto\Codigo\foto.bmp"
guarda al piojo ahí... me parece que el problema es que el directorio
'Codigo' debe tener acento (Código), y probablemente te metas en
problemas. probaste verificar si el archivo existe con os.path.isfile
antes de abrirlo?
Post by Raúl Morales
import os.path
os.path.isfile(r'E:\Proyecto\Codigo\foto.bmp')
debería responderte 'True'.

saludos,

sánti\
--
música es silencio vestido.
http://yaco.net/
Raúl Morales
2007-10-16 19:15:46 UTC
Permalink
Hola, muchas gracias por su ayuda:
La cuestión ahora es que como ya habia indicado antes,
Post by Raúl Morales
La ruta que me retorna el GetPath() ( ruta = dlg.GetPath() )de un
FileDialog al imprimirla es algo como
"E:\Proyecto\Codigo\foto.bmp"
esa variable 'ruta' la estoy tomando de un dlg.GetPath() de un FileDialog,
entonces no le podría anteponer la r para que la tome como un raw tal cual
indica yaco.
Post by Raúl Morales
ruta = r"E:\Proyecto\Codigo\foto.bmp"
y como indico Manuel, sí era un problema el tener \foto.bmp, estaba tomando
el \f como escape, pero esto se solucionaría de la misma manera, habría que
convertir la variable ruta en una variable de tipo raw. o me equivoco?.
¿Cómo convertirla??

Saludos.
Raúl M.
Ramiro Morales
2007-10-16 19:32:43 UTC
Permalink
Post by yaco
Post by Ramiro Morales
Probá con replace(r'\', '/')
las cadenas crudas de caracteres (suena genial!) o 'raw strings' no
Post by Ramiro Morales
print r'\'
File "<stdin>", line 1
print r'\'
^
SyntaxError: EOL while scanning single-quoted string
de todas maneras, si pudieran, r'\' == '\\', que es lo que ya había probado.
yaco\
Hmm eso me pasa por responder al voleo sin probar en el intérprete. Gracias por
la aclaración yaco.
Post by yaco
esa variable 'ruta' la estoy tomando de un dlg.GetPath() de un FileDialog,
entonces no le podría anteponer la r para que la tome como un raw tal cual
indica yaco.
Post by Ramiro Morales
ruta = r"E:\Proyecto\Codigo\foto.bmp"
y como indico Manuel, sí era un problema el tener \foto.bmp, estaba tomando
el \f como escape, pero esto se solucionaría de la misma manera, habría que
convertir la variable ruta en una variable de tipo raw. o me equivoco?.
¿Cómo convertirla??
No, hace falta. El prefijo 'r' sólo se aplica cuando estás definiendo
literales, no
es una propiedad del objeto en si.

Si a lo que te referís es a lo que contabas mas abajo, lo que me
parece que estás viendo
Post by yaco
pero cuando intento hacer el Image.open(ruta), en el codigo fuente me sale el siguiente
(Este es otro error que inicialmente creo que es resultado del primero)
AttributeError: type object 'Image' has no attribute 'open'
El mensaje de error te está indicando que estas llamando a un metodo
open() en un
objeto Imagen cuando la clase de Imagen no tiene dicho método.

Suerte,
--
Ramiro Morales
Raúl Morales
2007-10-16 20:03:26 UTC
Permalink
Post by Ramiro Morales
No, hace falta. El prefijo 'r' sólo se aplica cuando estás definiendo
literales, no
es una propiedad del objeto en si.
Si, pero cuando hago el ruta = ruta.replace('\', '/'), no reconoce el \
solo, unicamente reemplaza donde haya \\

Si a lo que te referís es a lo que contabas mas abajo, lo que me
Post by Ramiro Morales
parece que estás viendo
Post by Raúl Morales
pero cuando intento hacer el Image.open(ruta), en el codigo fuente me
sale el siguiente
Post by Raúl Morales
(Este es otro error que inicialmente creo que es resultado del primero)
AttributeError: type object 'Image' has no attribute 'open'
El mensaje de error te está indicando que estas llamando a un metodo
open() en un
objeto Imagen cuando la clase de Imagen no tiene dicho método.
Bueno, ese es otro error al que no le he puesto mucho cuidado por ahora,
pero supongo que tambien me va a causar problemas puesto que estoy
importando el modulo Image y aun asi no reconoce el atributo 'open' . Lo
extraño es que si hago exactamente lo mismo desde el interprete, sí funciona
(ejecuta el Image.open(ruta), si la ruta estuviera buena claro )
Si alguien sabe porque puede ocurrir esto, por favor, pistas, señales,
rastros, recomendaciones etc...

Saludos.
Facundo Batista
2007-10-16 20:47:39 UTC
Permalink
Post by Raúl Morales
Bueno, ese es otro error al que no le he puesto mucho cuidado por ahora,
pero supongo que tambien me va a causar problemas puesto que estoy
importando el modulo Image y aun asi no reconoce el atributo 'open' . Lo
extraño es que si hago exactamente lo mismo desde el interprete, sí funciona
(ejecuta el Image.open(ruta), si la ruta estuviera buena claro )
Estoy siguiendo este thread, pero me cuesta mucho entender lo que
dices como para poder ayudarte. Lo mejor que puedes hacer, es
"mostrar" lo que sucede.

Puedes estar horas describiendo tu situación, pero lo mejor es
mostrarlo en el intérprete interactivo, o recortando tu código hasta
lo mínimo posible y enviando eso.

En el caso del Image, y el open, ¿qué sucede? ¿por qué dices que no lo
reconoce? ¿cual es el error (envía el traceback)?

Slds.
--
. Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Raúl Morales
2007-10-16 21:32:02 UTC
Permalink
Post by Facundo Batista
Estoy siguiendo este thread, pero me cuesta mucho entender lo que
dices como para poder ayudarte. Lo mejor que puedes hacer, es
"mostrar" lo que sucede.
Puedes estar horas describiendo tu situación, pero lo mejor es
mostrarlo en el intérprete interactivo, o recortando tu código hasta
lo mínimo posible y enviando eso.
En el caso del Image, y el open, ¿qué sucede? ¿por qué dices que no lo
reconoce? ¿cual es el error (envía el traceback)?
Slds.
OK, que pena para los que han leido y no les ha sido claro mi problema, lo
voy a intentar describir de la manera mas sencilla posible.

El pedazo de código del problema es el siguiente:
import Image
...
def AgregarFoto(self, event):
dlg = wx.FileDialog( self, message="Agregar Foto...", style=wx.OPEN)
dlg.SetFilterIndex(2)
if dlg.ShowModal() == wx.ID_OK:
self.foto = dlg.GetPath().encode("iso8859-1")
print self.foto # <-- esto imprime
'E:\Proyecto\Codigo\raul.bmp'
self.foto = self.foto.replace('\\', '/') # [1]
print self.foto #<-- imprime
'E:/Proyecto/Codigo/raul.bmp'
img = Image.open(self.foto, mode='r') # [2]
new_width = 180
new_height = new_width * img.size[1] / img.size[0]
self.scale(self.foto, new_width, new_height, self.foto) # metodo que
funciona bien

[1]: Siempre estuve intentando hacer el .replace en el interprete para ver
si funcionaba o no, y como lo he mostrado no me funciona, pero al tomarlo
directamente desde la variable original enel codigo fuente, si funciono!
Error de novato, me confie en lo que imprimia en la linea anterior a [1] y
con eso hacia las pruebas en el interprete. :-| Problema superado

pero ahora el problema es el siguiente:
el traceback es:
[2]:
Traceback (most recent call last):
File "E:\Proyecto\Codigo\Cartera.py", line 201, in AgregarFoto
img = Image.open(self.foto, mode='r')
AttributeError: class Image has no attribute 'open'

pero si lo intento abrir desde el interprete, todo funciona, es decir, abre
la foto si hago img.show()
Post by Facundo Batista
Post by Raúl Morales
import Image
ruta = 'E:/Proyecto/Codigo/raul.bmp'
img = Image.open(ruta)
img.show()
#muestra la foto;

Saludos.
Lucio Torre
2007-10-16 22:19:08 UTC
Permalink
Post by Raúl Morales
import Image
File "E:\Proyecto\Codigo\Cartera.py", line 201, in AgregarFoto
img = Image.open(self.foto , mode='r')
AttributeError: class Image has no attribute 'open'
pero si lo intento abrir desde el interprete, todo funciona, es decir,
abre la foto si hago img.show()
Post by Raúl Morales
Post by Raúl Morales
import Image
ruta = 'E:/Proyecto/Codigo/raul.bmp'
img = Image.open(ruta)
img.show()
#muestra la foto;
El problema no es que el path este bien o mal, es que Image no tiene el
atributo "open" cuando ejecutas el script completo. (ver error).
Post by Raúl Morales
Post by Raúl Morales
import Image
Image.foobarasa
Traceback (most recent call last):
File "<stdin>", line 1, in ?
AttributeError: 'module' object has no attribute 'foobarasa'
Se queja que el *modulo* "Image" no tiene el atributo. En tu caso se
estga quejando que la *clase* "Image" no tiene el atributo.

Para mi que tenes un import con '*' en algun lado que te pisa el modulo
de PIL o definis una clase Image vos.

Saludos,

Lucio.

Manuel Kaufmann
2007-10-15 03:31:08 UTC
Permalink
Post by Raúl Morales
Estoy intentando reemplazar el caracter \ que esta dentro de una ruta por
un /, el problema es que no se como poner el backslash en el replace. Hago
algo como esto: ruta = ruta.replace("\\", "/"), pero el problema es que
reemplaza solo donde encuentre un doble backslash ' \\', y como no puedo
hacer un .replace(' \', '/') porque toma el (' \) como caracter de escape,
es decir, el problema es que no reemplaza un solo ' \' por el '/ '. He
intentado de muchas formas, pero si hago algo como ruta =
ruta.replace(chr(92), '/') el caracter 92 del ascii, igual lo toma como '
\\', como por mostar una de las formas que he intentado. En la web solo he
encontrado que para imprmir el \, basta con hacer por ejemplo >>>print "\\"
Creo que el problema que tenés es que al ingresar la dirección del archivo
con:
ruta = "E:\Proyecto\Codigo\foto.bmp"

El intérprete te está tomando el "\f" cómo una secuencia de escape, por lo que
podés probar anteponiendo la "r" a declaración de la cadena, mirá este
ejemplo.
Post by Raúl Morales
ruta = r"E:\Proyecto\Codigo\foto.bmp"
ruta
'E:\\Proyecto\\Codigo\\foto.bmp'
Post by Raúl Morales
ruta.replace("\\", "/")
'E:/Proyecto/Codigo/foto.bmp'
Post by Raúl Morales
ruta = "E:\Proyecto\Codigo\foto.bmp"
ruta.replace("\\", "/")
'E:/Proyecto/Codigo\x0coto.bmp'
Post by Raúl Morales
print _ # imprimo lo devuelto por el replace
E:/Proyecto/Codigo
oto.bmp
Fijate que se "desorbitó" todo cuando muestro la última cadena luego de
aplicar el replace. Espero que te sirva.

Saludos!
--
Kaufmann Manuel
Blog: http://humitos.wordpress.com/
PyAr: http://www.python.com.ar/
Loading...