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-адресов, а также для локальных путей к файлам. Почему бы и нет?