os.path.basename работает с URL, почему? - PullRequest
12 голосов
/ 11 июля 2009
>>> os.path.basename('http://example.com/file.txt')
'file.txt'

.. а я думал os.path.* работает только на локальных путях, а не на URL? Обратите внимание, что приведенный выше пример был запущен и в Windows .. с похожим результатом.

Ответы [ 6 ]

19 голосов
/ 11 июля 2009

На практике многие функции os.path являются просто функциями манипуляции со строками (которые просто случаются , что особенно удобно для манипулирования путями) - и поскольку это безобидно и иногда удобно, хотя формально и говорит "неверно" Я сомневаюсь, что это изменится в ближайшее время - для получения более подробной информации, используйте следующую простую однострочную строку в командной строке / командной строке:

$ python -c"import sys; import StringIO; x = StringIO.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print x.getvalue().splitlines()[10][9:]"

Или, для Python 3:

$ python -c"import sys; import io; x = io.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print(x.getvalue().splitlines()[10][9:])"
3 голосов
/ 11 июля 2009

В Windows посмотрите исходный код: C: \ Python25 \ Lib \ ntpath.py

def basename(p):
    """Returns the final component of a pathname"""
    return split(p)[1]

os.path.split (в том же файле) просто разделить "\" (и еще что-то)

2 голосов
/ 22 мая 2018

Остерегайтесь URL-адресов с параметрами, якорями или чем-то, что не является «простым» URL-адресом:

>>> import os.path
>>> os.path.basename("protocol://fully.qualifie.host/path/to/file.txt")
'file.txt'
>>> os.path.basename("protocol://fully.qualifie.host/path/to/file.txt?param1&param1#anchor")
'file.txt?param1&param1#anchor'
2 голосов
/ 11 июля 2009

Использовать источник Люка:


def basename(p):
    """Returns the final component of a pathname"""
    i = p.rfind('/') + 1
    return p[i:]

Изменить (ответ на уточнение):

Он работает для URL случайно, вот и все. Из-за этого использование его поведения может считаться запахом кода некоторыми.

Попытка его "исправить" (проверьте, не является ли переданный путь URL-адресом) также удивительно трудна

www.google.com/test.php
me@other.place.com/12
./src/bin/doc/goto.c

в то же время являются правильными путями и URL-адресами (относительными), как и http:/hello.txt (один /, и только в Linux, и это немного глупо :)) Вы можете «исправить» это для абсолютных URL, но относительные все равно будут работать. Работа с одним частным случаем по-разному - это большая проблема в мире питонов.

Чтобы подвести итог: импортируйте это

1 голос
/ 29 января 2016

Косая черта также является допустимым разделителем пути в Windows.

Просто командная строка не принимает пути, начинающиеся с /, поскольку этот символ зарезервирован для аргументов args.

0 голосов
/ 11 июля 2009

Почему? Потому что это полезно для анализа URL-адресов, а также локальных путей к файлам. Почему нет?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...