2010-08-20 2 views
1

У меня есть проблема с ссылается на специальный символ в строке:Как сослаться на знак «» в питоне строке

у меня есть: path='C:\dir\dir1\dir2\filename.doc'

и я хочу filename.

Когда я пытаюсь: filename=path[path.rfind("\"):-4]

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

+2

Прочтите описание документации. Http: //docs.python.org/reference/lexical_analysis.html # string-literals Говорит '\\\' –

+0

Возможно, вы захотите попытаться избежать размещения литералов в вашем скрипте; взяв имена файлов из других источников (командная строка, базовый файл конфигурации и т. д.), вы можете избежать этой проблемы. Делает ваш код более многоразовым. –

ответ

12

Вы можете использовать "\\", технически было бы лучше использовать os.path.sep если вы настаиваете при использовании обратной косой черты. Но, тем не менее, используйте / на ваших дорогах, он отлично работает на Windows

Python имеет builtin functions to manipulate paths. Обратите внимание, что вам нужно удвоить обратный слэш, если вы по-прежнему предпочитают их forwardslashes

>>> import os 
>>> path='C:\\dir\\dir1\\dir2\\filename.doc' 
>>> os.path.splitext(os.path.basename(path)) 
('filename', '.doc') 

и использование forwardslashes

>>> path='C:/dir/dir1/dir2/filename.doc' 
>>> os.path.splitext(os.path.basename(path)) 
('filename', '.doc') 
+2

+1 для точки к уже работающей, а также переносной стандартной реализации. – delnan

+0

+1 за то, что то же самое @delnan сказал –

+0

+1: Очень хороший ответ. Забыл это, хотя: http://docs.python.org/library/os.path.html –

1

экранировать:

filename=path[path.rfind("\\"):-4] 

или еще лучше, использовать basename - часть os.path библиотеки языка Python:

from os.path import basename 
basename(path) 

Из руководства basename:

Возвращает имя базы пути пути. Это вторая половина пары, возвращенная split(path). Обратите внимание, что результат этой функции отличается от базовой программы Unix; где basename для '/foo/bar/' возвращает 'bar', функция basename() возвращает пустую строку ('').

2

Либо убедите его как «\\», либо используйте необработанные строки: r "\".

+4

Вы не можете закончить исходные строки '' ', поэтому' r '\ "' не работает –

+0

@Gnibbler: 'путь = r'C: \ dir \ dir1 \ dir2 \ filename.doc'' работает. Что у тебя было на уме? –

+0

@Manoj: @Gnibbler прав, 'r" \ "' не работает (и не 'r'C: \ dir \ dir1 \ dir2 \ ''), потому что даже в необработанных строках '\' '/' \ "' все еще ускользает (должно быть) – delnan

0

Вы можете ввести double: "\".

Однако разделить имя файла из Windows, имя файла, используйте раздел как os.path.split работает только с /:

>>> path=r'C:\dir\dir1\dir2\filename.doc' 
>>> print path.rpartition('\\')[-1] 
filename.doc 
+1

Вы не можете закончить исходные строки '' ', поэтому' r '\ '' не работает –

+0

Заметил это во время игры с IDLE и отредактировал за 10 минут до вашего комментария. В то же время, когда я ввел код rpartition. Может быть, я не работаю для меня для os.path.split, поскольку теперь я запускаю Linux. basename должен работать. –

+0

Отредактировано 10 минут _after_ my comment :) –

0

Существует что-то об этом в FAQ: Why can’t raw strings (r-strings) end with a backslash?

Если вы При попытке создать Windows имена путей, обратите внимание, что все системные вызовы Windows принимают косые черты тоже:

f = open("/mydir/file.txt") # works fine! 

Если вы пытаетесь построить путь для команды DOS, попробуйте, например, один из

dir = r"\this\is\my\dos\dir" "\\" 
dir = r"\this\is\my\dos\dir\ "[:-1] 
dir = "\\this\\is\\my\\dos\\dir" 
Смежные вопросы