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

дает мне ошибку"EOL при сканировании строки с одной кавычкой"? (Обратный слэш в строке)

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

Можете ли вы помочь мне, пожалуйста, как вы видите проблему?

+0

могли бы вы переименовать вопрос на что-то более полезное – SilentGhost

+1

Кроме того, обратите внимание, как Stack Overflow автоматически окрашивает ваш код, чтобы проблема стала очевидной. –

ответ

19

Символ обратной косой черты интерпретируется как побег. Используйте два раза подряд для окон путей:

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

Спасибо, @recursive - промах пальцев ... – gimel

10

Дополнительно к blackslash проблемы, не присоединяются к пути с оператором «+» - используйте os.path.join вместо этого.

Кроме того, создайте путь к домашнему каталогу пользователя, который, вероятно, завершится неудачей в новых версиях Windows. В pywin32 есть функции API.

+1

+1 os.path.join - это путь. Будет ли os.getenv ('HOME') установленным на Win32? У меня нет коробки MS для проверки. –

+0

У моей плохой XP-in-a-VM есть переменная окружения USERPROFILE, которая указывает на домашний каталог, но я не знаю, насколько это официально. –

+0

os.path.join действительно удобен –

7

Вы можете использовать функцию os.path.expanduser, чтобы получить путь к домашней директории пользователей. Он даже не должен быть существующим пользователем.

>>> 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" расширяются на путь к пользователю домашнего каталога. Просто один «~» распространяется на текущий домашний каталог пользователей.

+0

+1, работает корректно в Windows 7, где вместо него находится 'C: \ Users \ foo'. –

5

Python, как и многие другие языки, использует обратную косую черту как escape-символ (поэтому двойные кавычки в конце строки xp1 = ... поэтому рассматриваются как часть строки, а не как разделитель строки).

Это на самом деле довольно простой материал, поэтому я настоятельно рекомендую вам прочитать python tutorial, прежде чем идти дальше.

Вы могли бы быть заинтересованы в сырых строках, которые делают не побега обратными косыми черты. Просто добавьте г непосредственно перед строкой:

xp1 = r"\Documents and Settings\" 

Кроме того, при обработке путей к файлам, вы должны использовать os.path модуль , который будет использовать «/» или «\» в зависимости от младшего матроса на котором запущена программа. Например:

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

будет производить "данные/город/geo.txt" на Linux и "Data \ город \ geo.txt" на Windows.

+1

Необработанная строка не может заканчиваться нечетным числом обратных косых черт. Попробуй. –

+0

Эй, ты прав. Я должен прочитать учебник! ;-) – MiniQuark

3

\" интерпретируется как «вставить двойной кавычки в строку, так что вам не хватает завершающего кавычки в строковый литерал. Обратите внимание, что сырая строка r"\" не помогает.

Цитата из documentation (жирный шрифт мой):.

Когда «R» или префикс «R» присутствует, символ после обратной косой черты включен в строку без изменений, и все обратные косые оставлены в строке, например, строковый литерал r "\ n" состоит из двух символов: обратная косая черта и строчная буква n.Кавычки строк могут быть экранированы с обратной косой чертой, но обратная косая черта остается в строке; например, r "\" "является допустимым строковым литералом, состоящим из двух символов: обратная косая черта и двойная кавычка; r" \ "не является допустимым строковым литералом (даже необработанная строка не может заканчиваться нечетным числом обратных косых черт). В частности, необработанная строка не может заканчиваться одной обратной косой чертой (поскольку обратная косая черта избегает следующего символа кавычки). Обратите также внимание, что один обратный слэш, сопровождаемый новой строкой, интерпретируется как эти два символа как часть строки, а не как продолжение строки.

ответ @MizardX дал правильный способ кодировать то, что вы делаете, независимо.

 Смежные вопросы

  • Нет связанных вопросов^_^