2012-08-12 159 views
19

que tienen un diccionario:¿Cómo deshacerse de la doble barra invertida en python windows file path string?

my_dictionary = {"058498":"table", "064165":"pen", "055123":"pencil"} 

que iterar sobre ella:

for item in my_dictionary: 
    PDF = r'C:\Users\user\Desktop\File_%s.pdf' %item 
    doIt(PDF) 

def doIt(PDF): 
    part = MIMEBase('application', "octet-stream") 
    part.set_payload(open(PDF,"rb").read()) 

pero me sale este error:

IOError: [Errno 2] No such file or directory: 'C:\\Users\\user\\Desktop\\File_055123.pdf' 

No puede encontrar mi archivo. ¿Por qué cree que hay dos barras diagonales inversas en la ruta del archivo?

+3

Hay una sola barra invertida. Estás viendo la representación de la cadena. El archivo no existe. –

+2

La barra diagonal inversa doble no es incorrecta, Python la imprime/lo representa para el usuario. Si 'a = r'raw s \ tring'' y' b = 'raw s \\ tring'' (no' r 'y slash doble explícita) entonces ambos se representan como '' raw s \\ tring''. – aneroid

Respuesta

14

La barra diagonal inversa doble no está equivocada, python la imprime/lo representa de la manera del usuario. Si a = r'raw s\tring' y b = 'raw s\\tring' (sin 'r' y doble barra explícita), ambos se representan como 'raw s\\tring'.

>>> a = r'raw s\tring' 
>>> b = 'raw s\\tring' 
>>> a 
'raw s\\tring' 
>>> b 
'raw s\\tring' 

Por cierto, el código está claramente editado y no coincidentes entre lo real y lo que usted envió ya que no hay un diferencia obvia en el mensaje de error y el nombre del archivo:

Usted tiene:

PDF = r'C:\Users\user\Desktop\File_%s.pdf' %item 

pero la salida muestra:

'C:\\Users\\user\\Desktop\\Filed_055123.pdf' 

Observe el adicional en el nombre de archivo Filed_ contra File_. El mensaje de error puede provenir de la parte que ha editado.

+0

no hay 'd':' 'C: \\ Usuarios \\ usuario \\ Escritorio \\ Archivo_055123.pdf'' –

+0

Probablemente se haya editado ahora. – aneroid

+8

Lo siento pero esta no fue una respuesta útil. Entonces, si las barras diagonales dobles son el caso, entonces ¿cómo lo arregla uno? – DeeWBee

9

barras invertidas dobles se deben a r, cadena de texto:

r'C:\Users\user\Desktop\File_%s.pdf' , 

Se utiliza porque el \ podría escapar algunos de los personajes.

>>> strs = "c:\desktop\notebook" 

>>> print strs    #here print thinks that \n in \notebook is the newline char 
c:\desktop 
otebook 

>>> strs = r"c:\desktop\notebook" #using r'' escapes the \ 
>>> print strs 

c:\desktop\notebook 

>>> print repr(strs) #actual content of strs 
'c:\\desktop\\notebook' 
+0

En el ejemplo anterior, si visualiza 'strs' como' >>> strs' debería obtener 'c: \\ desktop \\ notebook'. print no muestra el escapado, es decir, doble barra \\ –

3

No lo hace. La barra diagonal inversa doble es la forma en que la computadora dice barra diagonal inversa. Sí, sé que esto suena raro, pero piénselo de esta manera: para representar caracteres especiales, se eligió la barra invertida como un carácter de escape (por ejemplo, \ n significa nueva línea, y no la barra invertida seguida del carácter n). Pero, ¿qué sucede si realmente desea imprimir (o usar) una barra diagonal inversa (posiblemente seguida de más caracteres), pero no desea que la computadora la trate como un personaje que escapa? En ese caso, escapamos de la barra diagonal inversa, lo que significa que usamos una doble barra diagonal inversa para que la computadora comprenda que se trata de una sola barra diagonal inversa.

Se hace automáticamente en su caso debido a r que ha agregado antes de la cadena.

-1

alwbtc @ me atrevo a decir: "He encontrado el error ..."

reemplazar

PDF = r'C:\Users\user\Desktop\File_%s.pdf' %item 
doIt(PDF)` 

con

for item in my_dictionary: 
    PDF = r'C:\Users\user\Desktop\File_%s.pdf' % mydictionary[item] 
    doIt(PDF)` 

, de hecho, que se busca realmente File_pencil.pdf (no File_055123.pdf). Usted estaba deslizando el diccionario índice, no su contenido. Este tema del foro tal vez tiene un efecto secundario.

3

ahórrate un dolor de cabeza, puedes usar otras barras también. si sabes lo que digo. el opuesto mira barras.

que está utilizando ahora PDF = 'C:\Users\user\Desktop\File_%s.pdf' %item

intenta utilizar **

PDF = 'C:/Users/user/Desktop/File_%s.pdf' %item

** no será tratado como un personaje escapar.

Cuestiones relacionadas