2009-02-01 8 views
2
import os 
xp1 = "\Documents and Settings\" 
xp2 = os.getenv("USERNAME") 
print xp1+xp2 

Donne-moi une erreur"EOL lors de l'analyse de chaîne de caractères entre guillemets simples"? (Barre oblique inverse dans la chaîne)

File "1.py", line 2 
xp1 = "\Documents and Settings\" 
          ^
SyntaxError: EOL while scannning single-quoted string 

Pouvez-vous me aider s'il vous plaît, est-ce que vous voyez le problème?

+0

pouvez-vous s'il vous plaît renommer question à quelque chose de plus utile – SilentGhost

+1

noter également comment Stack Overflow colorie automatiquement votre code pour que le problème devienne évident. –

Répondre

19

La barre oblique inverse est interprétée comme une échappement. Utilisez doubles barres obliques inversées pour les chemins fenêtres:

>>> xp1 = "\\Documents and Settings\\" 
>>> xp1 
'\\Documents and Settings\\' 
>>> print xp1 
\Documents and Settings\ 
>>> 
+0

Merci, @recursive - un lapsus des doigts ... – gimel

10

De plus au problème blackslash, ne se joignent pas les chemins avec le « + » opérateur - utiliser os.path.join à la place.

Également, construisez le chemin d'accès au répertoire de base d'un utilisateur comme cela est susceptible d'échouer sur les nouvelles versions de Windows. Il y a des fonctions API pour ça dans pywin32.

+1

+1 os.path.join est la voie à suivre. Os.getenv ('HOME') serait-il défini sur Win32? Je n'ai pas de boîte MS à vérifier .. –

+0

Ma pauvre petite XP-in-a-VM a la variable d'environnement "USERPROFILE", qui pointe vers le répertoire personnel, mais je ne sais pas à quel point c'est officiel. –

+0

os.path.join est vraiment pratique –

7

Vous pouvez utiliser la fonction os.path.expanduser pour obtenir le chemin d'accès au répertoire personnel d'un utilisateur. Il ne doit même pas être un utilisateur existant.

>>> import os.path 
>>> os.path.expanduser('~foo') 
'C:\\Documents and Settings\\foo' 
>>> print os.path.expanduser('~foo') 
C:\Documents and Settings\foo 
>>> print os.path.expanduser('~') 
C:\Documents and Settings\MizardX 

"~user" est dilatée au chemin de utilisateur répertoire de. Un simple "~" est développé dans le répertoire de base des utilisateurs actuels.

+0

+1, fonctionne correctement sur Windows 7, où il est 'C: \ Users \ foo' à la place. –

5

Python, comme beaucoup d'autres langages, utilise la barre oblique inverse comme caractère d'échappement (les guillemets à la fin de votre ligne xp1 = ... sont donc considérés comme faisant partie de la chaîne, pas comme le délimiteur de la chaîne).

Ceci est en fait assez basique, donc je vous recommande fortement de lire le python tutorial avant d'aller plus loin.

Vous pourriez être intéressé par premières cordes, qui ne pas antislashs d'échappement. Il suffit d'ajouter r juste avant la chaîne:

xp1 = r"\Documents and Settings\" 

De plus, lors de la manipulation des chemins de fichiers, vous devez utiliser le module de os.path, qui utilisera «/» ou « \ », selon le pouvant être élué sur lequel le programme est exécuté. Par exemple:

import os.path 
xp1 = os.path.join("data","cities","geo.txt") 

produira "données/villes/geo.txt" sur Linux et "data \ villes \ geo.txt" sous Windows.

+1

Une chaîne brute ne peut pas se terminer par un nombre impair de barres obliques inverses. Essayez-le. –

+0

Hey, vous avez raison. Je devrais lire le tutoriel! ;-) – MiniQuark

3

\" est interprété comme « insérer un guillemet dans la chaîne, de sorte que vous manque une citation de terminaison pour la chaîne littérale. Notez qu'une chaîne brute r"\" ne peut pas aider non plus.

Citation du documentation (gras est le mien).

Lorsqu'un « r » ou préfixe « R » est présent, un caractère suivant une barre oblique inverse est inclus dans la chaîne sans changement, et tous les antislash sont laissés dans la chaîne Par exemple, la chaîne littérale r "\ n" est composée de deux caractères: une barre oblique inverse et un 'n' minuscule.Les guillemets de chaîne peuvent être échappés avec une barre oblique inverse, mais la barre oblique inverse reste dans la chaîne; par exemple, r "\" "est un littéral de chaîne valide composé de deux caractères: une barre oblique inverse et une guillemets doubles; r" \ "n'est pas un littéral de chaîne valide (même une chaîne brute ne peut pas se terminer par un nombre impair de barres obliques inverses Plus précisément, une chaîne brute ne peut pas se terminer par une seule barre oblique inverse (puisque la barre oblique inversée échappera au caractère de citation suivant.) Notez également qu'une seule barre oblique inverse suivie d'une nouvelle ligne est interprétée comme faisant partie de la chaîne. continuation ligne.

le @MizardX de réponse a est la bonne façon de coder ce que vous faites, peu importe.

Questions connexes