Использование os.path.split
или, os.path.basename
как предлагают другие, не будет работать во всех случаях: если вы запускаете сценарий в Linux и пытаетесь обработать классический путь в стиле Windows, это не удастся.
Пути Windows могут использовать либо обратную косую черту, либо прямую косую черту в качестве разделителя пути. Следовательно, ntpath
модуль (который эквивалентен os.path при запуске в Windows) будет работать для всех (1) путей на всех платформах.
import ntpath
ntpath.basename("a/b/c")
Конечно, если файл заканчивается косой чертой, базовое имя будет пустым, поэтому создайте свою собственную функцию для его обработки:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Проверка:
>>> paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c',
... 'a/b/../../a/b/c/', 'a/b/../../a/b/c']
>>> [path_leaf(path) for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']
(1) Есть одно предупреждение: имена файлов в Linux могут содержать обратную косую черту . Таким образом, в linux r'a/b\c'
всегда ссылается на файл b\c
в a
папке, в то время как в Windows он всегда ссылается на c
файл в b
подпапке a
папки. Поэтому, когда в пути используются как прямая, так и обратная косая черта, вам необходимо знать соответствующую платформу, чтобы иметь возможность правильно ее интерпретировать. На практике обычно можно предположить, что это путь к Windows, поскольку в именах файлов Linux обратные слеши редко используются, но имейте это в виду при кодировании, чтобы не создавать случайных дыр в безопасности.
os.path
просто загружаетntpath
модуль внутри. Используя этот модуль, можно обрабатывать'\\'
разделители пути даже на машинах Linux. Для Linuxposixpath
модуль (соответственноos.path
) упростит операции пути, чтобы разрешить только разделители в стиле posix'/'
.r'C:\path\to\file.txt'
) на компьютере с Linux, вам нужно использовать модуль ntpath. В противном случае вы можете использовать функции из os.path. Это связано с тем, что системы Linux обычно допускают использование символов обратной косой черты в именах файлов (как объяснено в ответе).os.path.basename(os.path.normpath(path))
?На самом деле, есть функция, которая возвращает именно то, что вы хотите
источник
os.path.basename(your_path)
Это сработало! Я хотел путь сценария:os.path.dirname(os.path.realpath(__file__))
и имя скрипта:os.path.basename(os.path.realpath(__file__))
. Спасибо!'C:\\temp\\bla.txt'
вместо этого.os.path.split - это функция, которую вы ищете
источник
В питоне 3
источник
хвост это то, что вы хотите, имя файла.
Подробнее смотрите в документации по модулю Python OS.
источник
источник
В вашем примере вам также нужно убрать косую черту справа и справа, чтобы вернуться
c
:Второй уровень:
Обновление: я думаю
lazyr
, предоставил правильный ответ. Мой код не будет работать с Windows-подобными путями в Unix-системах и наоборот с Unix-подобными путями в Windows-системах.источник
r"a\b\c"
ни для Linux, ни для"a/b/c"
Windows.os.path.basename(path)
будет работать только еслиos.path.isfile(path)
естьTrue
. Поэтомуpath = 'a/b/c/'
вообще не является допустимым именем файла ...os.path.basename("a/b/c/")
возвращается""
из-за косой черты.lazyr
вы правы! Я не думал об этом. Было бы безопасно просто сделатьpath = path.replace('\\', '/')
?это вернет: paint.exe
источник
fname = str(path).split('/')[-1]
Если вы хотите получить имя файла автоматически, вы можете сделать
источник
Если путь к файлу не заканчивается символом "/", а каталоги разделены символом "/", используйте следующий код. Как мы знаем, обычно путь не заканчивается на «/».
Но в некоторых случаях, например, URL-адреса заканчиваются на «/», используйте следующий код
но когда ваш путь разделен "\", который вы обычно находите в путях Windows, тогда вы можете использовать следующие коды
Вы можете объединить обе функции в одну, проверив тип ОС и вернув результат.
источник
Это работает для Linux и Windows, а также со стандартной библиотекой
Результаты:
источник
Вот решение только для регулярных выражений, которое, похоже, работает с любым путем ОС в любой ОС.
Никаких других модулей не требуется, и предварительная обработка также не требуется:
Обновить:
Если вы хотите только потенциальное имя файла, если она присутствует (т.е.
/a/b/
является реж и такc:\windows\
), изменить регулярное выражение:r'[^\\/]+(?![\\/])$'
. Для "regex challengeed" это изменяет положительный прогноз прямого просмотра для некоторого вида косой черты на отрицательный прямой взгляд вперед, в результате чего имена путей, заканчивающиеся указанным слешем, ничего не возвращают вместо последнего подкаталога в имени пути. Конечно, нет никакой гарантии, что потенциальное имя файла на самом деле относится к файлу и для этогоos.path.is_dir()
илиos.path.is_file()
должно быть использовано.Это будет соответствовать следующим образом:
Регулярное выражение можно проверить здесь .
источник
Может быть, просто мое все в одном решении без каких-либо важных новых (смотрите временный файл для создания временных файлов: D)
Получение значений
abc.name
будет такой строкой:'/tmp/tmpks5oksk7'
я могу заменить/
ее пробелом.replace("/", " ")
и затем вызватьsplit()
. Это вернет список, и я получу последний элемент списка с[-1]
Не нужно импортировать какой-либо модуль.
источник
Я никогда не видел пути с двойной обратной косой чертой, они существуют? Встроенная функция модуля Python
os
не работает для тех. Все остальные работают, также предостережение, данное вами сos.path.normpath()
:источник
Разделителем Windows может быть имя файла Unix или путь к Windows. Разделитель Unix может существовать только в пути Unix. Наличие разделителя Unix указывает путь не из Windows.
Следующее зачистит (разделит конечный разделитель) специальным разделителем ОС, затем разделит и вернет самое правое значение. Это некрасиво, но просто основано на предположении выше. Если предположение неверно, пожалуйста, обновите, и я обновлю этот ответ, чтобы соответствовать более точным условиям.
образец кода:
источник
Для полноты картины, вот
pathlib
решение для Python 3.2+:Это работает как на Windows, так и на Linux.
источник
В обоих Python 2 и 3, используя модуль pathlib2 :
Применение:
С вашим тестом:
Идея здесь состоит в том, чтобы преобразовать все пути в единое внутреннее представление
pathlib2
с различными декодерами в зависимости от платформы. К счастью,pathlib2
включает универсальный вызываемый декодер,PurePath
который должен работать на любом пути. В случае, если это не работает, вы можете принудительно распознать путь Windowsfromwinpath=True
. Это разделит входную строку на части, последняя - это тот лист, который вы ищете, отсюда иpath2unix(t)[-1]
.Если аргумент
nojoin=False
, путь будет присоединен обратно, так что выходной файл будет просто входной строкой, преобразованной в формат Unix, что может быть полезно для сравнения подпутей на разных платформах.источник