"EOL при сканировании строки в одинарных кавычках"? (обратная косая черта в строке) - PullRequest
4 голосов
/ 01 февраля 2009
import os
xp1 = "\Documents and Settings\"
xp2 = os.getenv("USERNAME")
print xp1+xp2

дает мне ошибку

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

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

Ответы [ 5 ]

21 голосов
/ 01 февраля 2009

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

>>> xp1 = "\\Documents and Settings\\"
>>> xp1
'\\Documents and Settings\\'
>>> print xp1
\Documents and Settings\
>>> 
11 голосов
/ 01 февраля 2009

Помимо проблемы с черной косой чертой, не объединяйте пути с помощью оператора "+" - используйте os.path.join.

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

8 голосов
/ 01 февраля 2009

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

6 голосов
/ 01 февраля 2009

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

На самом деле это довольно простые вещи, поэтому я настоятельно рекомендую вам прочитать руководство по питону , прежде чем идти дальше.

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

xp1 = r"\Documents and Settings\"

Более того, при манипулировании путями к файлам вы должны использовать модуль os.path , который будет использовать "/" или "\" в зависимости от O.S. на котором запущена программа. Например:

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

создаст «data / towns / geo.txt» в Linux и «data \ towns \ geo.txt» в Windows.

4 голосов
/ 09 декабря 2011

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

Цитата из документации (жирный шрифт мой):

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

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

...