2008-11-19 19 views
42

Tengo una cadena que contiene comillas dobles y barras diagonales inversas que quiero establecer en una variable en Python. Sin embargo, cada vez que intento establecerlo, las comillas o barras se eliminan o se escapan. He aquí un ejemplo:Citando barras diagonales inversas en literales de cadena Python

>>> foo = 'baz "\"' 
>>> foo 
'baz ""' 

Así que en lugar de baz "\" como yo quiero me estoy baz "". Pues si yo trato de escapar de la barra invertida, que tampoco ayuda:

>>> foo = 'baz "\\"' 
>>> foo 
'baz "\\"' 

cual coincide ahora con lo que puse en, pero no era lo que yo quería. ¿Cómo se soluciona este problema?

Respuesta

61

Estás siendo engañado por la salida - el segundo enfoque que estás tomando realmente hace lo que quieres, simplemente no lo estás creyendo. :)

>>> foo = 'baz "\\"' 
>>> foo 
'baz "\\"' 
>>> print foo 
baz "\" 

Por cierto, hay otra forma de cadena que podría ser un poco más claro:

>>> print r'baz "\"' 
baz "\" 
20

utilizar una cadena prima:

>>> foo = r'baz "\"' 
>>> foo 
'baz "\\"' 

Tenga en cuenta que a pesar de que se ve mal, en realidad derecho. Solo hay una barra invertida en la cadena foo.

Esto sucede porque cuando simplemente teclea foo en el indicador, python muestra el resultado de __repr__() en la cadena. Esto lleva a la siguiente (aviso sólo una barra invertida y sin comillas alrededor de la cadena print ed):

>>> foo = r'baz "\"' 
>>> foo 
'baz "\\"' 
>>> print foo 
baz "\" 

y vamos a seguir adelante porque hay más trucos de barra invertida. Si usted quiere tener una barra invertida al final de la cadena y utilizar el método anterior te encontrarás con un problema:

>>> foo = r'baz \' 
    File "<stdin>", line 1 
    foo = r'baz \' 
       ^ 
SyntaxError: EOL while scanning single-quoted string 

cuerdas primas no funcionan correctamente cuando se hace eso. Usted tiene que utilizar una cadena normal y escapar de sus barras invertidas:

>>> foo = 'baz \\' 
>>> print foo 
baz \ 

Sin embargo, si está trabajando con los nombres de archivos de Windows, usted se encontrará con un poco de dolor. Lo que se quiere hacer es utilizar barras diagonales y la función os.path.normpath():

myfile = os.path.normpath('c:/folder/subfolder/file.txt') 
open(myfile) 

Esto ahorrará una gran cantidad de escapar y secador de desgarramiento. This page fue útil al pasar por esto hace un tiempo.

+1

Si imprime como Charles Duffy hizo anteriormente, aparecerá correctamente. Cuando estás haciendo solo "foo", Python está usando la función __repr __() para mostrar la cadena. Se imprime con una barra invertida adicional para que cuando asigne el resultado a una variable, el contenido sea idéntico. –

+0

Excelente punto, he actualizado mi respuesta para agregar el "por qué". –

3

Lo que Harley dijo, excepto el último punto: en realidad no es necesario cambiar el '/' en '\' antes de abrir. Windows está muy contento de aceptar rutas con barras inclinadas.

infile = open('c:/folder/subfolder/file.txt') 

El único momento en que es probable que necesite la cadena normpathed es si estás pasando a través de otro programa de la cáscara (usando os.system o el módulo subprocess).

-2

Otra forma de finalizar una cadena con una barra invertida es terminar la cadena con una barra invertida seguida de un espacio, y luego llamar a la función .strip() en la cadena.

yo estaba tratando de concatenar dos variables de cadena y tenerlos separados por una barra invertida, así que utilicé la siguiente:

newString = string1 + "\ ".strip() + string2 
Cuestiones relacionadas