Os.path.basename работает с URL-адресами, почему?

>>> os.path.basename('http://example.com/file.txt')
'file.txt'

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

Ответ 1

На практике многие функции 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:])"

Ответ 2

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

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

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

Ответ 3

Используйте источник Luke:


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

Изменить (ответ на пояснения):

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

Попытка "исправить" его (проверить, не прошел ли путь передачи), также удивительно сложно

www.google.com/test.php
[email protected]/12
./src/bin/doc/goto.c

одновременно являются правильными именами путей и URL-адресами (относительными), так что это http:/hello.txt (один/, и только для linux, и это довольно глупо:)). Вы можете "исправить" его для абсолютных URL-адресов, но относительные будут работать. Обращение с одним специальным случаем по-другому является большим, нет в мире python.

Подводя итог: импортировать

Ответ 4

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

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

Ответ 5

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