EOL при сканировании строки в одинарных кавычках? (обратная косая черта в строке)

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

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


person Community    schedule 01.02.2009    source источник
comment
не могли бы вы переименовать вопрос во что-то более полезное   -  person SilentGhost    schedule 01.02.2009
comment
Также обратите внимание, как Stack Overflow автоматически окрашивает ваш код, чтобы проблема стала очевидной.   -  person ilya n.    schedule 09.06.2009


Ответы (6)


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

>>> xp1 = "\\Documents and Settings\\"
>>> xp1
'\\Documents and Settings\\'
>>> print xp1
\Documents and Settings\
>>> 
person gimel    schedule 01.02.2009

В дополнение к проблеме с черной косой чертой не объединяйте пути с помощью оператора «+» — вместо этого используйте os.path.join.

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

person Torsten Marek    schedule 01.02.2009
comment
+1 os.path.join - это то, что нужно. Будет ли os.getenv('HOME') установлен на Win32? У меня нет окна MS, чтобы проверить .. - person James Brady; 01.02.2009
comment
Моя бедная маленькая XP-in-a-VM имеет переменную среды USERPROFILE, которая указывает на домашний каталог, но я не знаю, насколько она официальна. - person Torsten Marek; 01.02.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" заменяется на путь к домашнему каталогу пользователя. Только один "~" расширяется до домашнего каталога текущего пользователя.

person Markus Jarderot    schedule 01.02.2009
comment
+1, корректно работает в Windows 7, где вместо него C:\Users\foo. - person Mark Tolonen; 09.12.2011

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

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

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

xp1 = r"\Documents and Settings\"

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

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

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

person MiniQuark    schedule 01.02.2009
comment
Необработанная строка не может заканчиваться нечетным числом обратных косых черт. Попробуй это. - person Mark Tolonen; 09.12.2011

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

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

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

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

person Mark Tolonen    schedule 09.12.2011

У меня была такая же ошибка, я решил ее, прочитав комментарий @Mark Tolonen

Это неправильная строка пути:

xp1 = "\Documents and Settings\"

Это правильная строка пути без последней обратной косой черты:

xp1 = "\Documents and Settings"
person V-cash    schedule 24.02.2021