82 votes

Python - Contre-oblique citant dans les littéraux de chaîne

J'ai une chaîne qui contient à la fois des guillemets doubles et les barres obliques inverses que je veux mettre une variable en Python. Cependant, chaque fois que j'essaie de régler ça, les citations ou les barres obliques sont soit éliminés, soit échappé. Voici un exemple:

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

Ainsi, au lieu de baz "\" comme je veux, je reçois baz "". Si je puis essayer d'échapper à la barre oblique inverse, il n'est pas de l'aide, soit:

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

Ce qui correspond maintenant à ce que j'ai mis dans mais n'était pas ce que je voulais. Comment contourner ce problème?

115voto

Charles Duffy Points 34134

Vous êtes induit en erreur par la sortie - la deuxième approche que vous adoptez fait en fait ce que vous voulez, vous n'y croyez tout simplement pas. :)

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

Par ailleurs, il existe une autre forme de chaîne qui pourrait être un peu plus claire:

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

54voto

Harley Holcombe Points 34618

Utiliser une chaîne brute:

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

Notez que même s'il est mauvais, c'est en fait la droite. Il y a une seule barre oblique inverse dans la chaîne foo.

Cela arrive parce que quand vous tapez foo à l'invite de commandes, python affiche le résultat de l' __repr__() sur la chaîne. Cela conduit à celui-ci (notez une seule barre oblique inverse et pas de guillemets autour de l' printed string):

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

Et nous allons continuer à aller de l'avant car il y a plus de barre oblique inverse astuces. Si vous voulez avoir une barre oblique inverse à la fin de la chaîne et de l'utilisation de la méthode ci-dessus, vous vous trouverez face à un problème:

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

Premières chaînes ne fonctionnent pas correctement lorsque vous faites cela. Vous devez utiliser un string et d'échapper à vos barres obliques inverses:

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

Toutefois, si vous travaillez avec des noms de fichiers Windows, vous êtes dans la douleur. Ce que vous voulez faire est d'utiliser des barres obliques et le os.path.normpath() fonction de:

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

Cela permettra d'économiser beaucoup de s'échapper et de cheveux-déchirure. Cette page a été portée de main lorsque vous allez à travers ce il ya un moment.

5voto

babbageclunk Points 3246

Ce que Harley a dit, sauf le dernier point - il n'est pas vraiment nécessaire de changer les '/' en '\' avant d'appeler open. Windows accepte assez volontiers les chemins avec des barres obliques.

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

La seule fois où vous aurez probablement besoin de la chaîne normpathed est si vous passez à un autre programme via le shell (en utilisant os.system ou le module subprocess ).

-1voto

James Points 1

Une autre façon de terminer une chaîne avec une barre oblique inverse est de terminer la chaîne avec une barre oblique inverse suivie d'un espace, puis d'appeler la fonction .strip() sur la chaîne.

J'essayais de concaténer deux variables de chaîne et de les séparer par une barre oblique inverse, j'ai donc utilisé ce qui suit:

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X