Почему бы не os.path.join использовать os.path.sep или os.sep?

Как мы знаем, окна принимают оба "\" а также "/" в качестве разделителя. Но в питоне "\" используется. Например, позвоните os.path.join("foo","bar"), 'foo\\bar' будет возвращен. Что раздражает, так это наличие escape-символа, поэтому вы не можете просто скопировать строку пути и вставить ее в адресную строку обозревателя.

Интересно, есть ли способ использовать Python "/" в качестве разделителя по умолчанию я попытался изменить значения os.path.sep и os.sep на "/", но os.path.join все еще использовать "\\",

какой правильный путь?

PS:

Я просто не понимаю, почему Python использует "\" в качестве разделителя по умолчанию в Windows, может быть, старая версия Windows не поддерживает "/"?

5 ответов

Решение

Почему бы не определить пользовательскую функцию отображения?

например

def display_path(path):
    return path.replace("\\", "/")

И если вы хотите заменить str.join за os.path.join, вы можете просто сделать это (str.join ожидает единый список, os.path.join надеется *args):

join = lambda *args: "/".join(args)

Возможно, лучше было бы позволить Python нормализовать все, а затем заменить, например:

join = lambda *args: os.path.join(*args).replace("\\", "/")

Единственная проблема с вышеуказанным может быть в posix, когда в пути к файлу есть пробел.

Вы могли бы тогда положить if утверждение в верхней части вашего файла утилит и определить display_path а также join как no-op и как os.path.join соответственно, если не в Windows.

Чтобы ответить на ваш вопрос как можно проще, просто используйте posixpath вместо os.path.

Так что вместо:

from os.path import join
join('foo', 'bar')
# will give you either 'foo/bar' or 'foo\\bar' depending on your OS

Использование:

from posixpath import join
join('foo', 'bar')
# will always give you 'foo/bar'

Это все о том, как Python обнаруживает вашу ОС:

# in os.py
if 'posix' in _names:
    ...
    import posixpath as path   

elif 'nt' in _names:
    ...
    import ntpath as path

Итак, на Windows ntpath модуль загружен. Если вы проверите ntpath.py а также posixpath.py модули, которые вы заметили бы, что ntpath.join() немного сложнее, и это также по той причине, которую вы упомянули: Windows понимает / в качестве разделителя пути.

Итог: хотя вы можете использовать posixpath.join() в Windows (пока аргументы находятся в POSIX формат), я бы не рекомендовал делать это.

Я не рекомендовал бы делать это.

Обратите внимание, что хотя Windows принимает косую черту / как разделитель пути, он имеет другое значение в некоторых контекстах.

Это рассматривается как относительный путь, используя cd, например:

Командная строка:

c: \ Users \ YourUser> cd / FooBar
C:\FooBar

Вот, / заменяет букву диска.


Кроме того, я не вижу проблемы с копированием строк, так как если вы print строка, строка отображается по вашему желанию:

Интерпретатор Python:

>>> импорт ОС
>>> print os.path.join("c:\", "foo","bar")
C: \ Foo \ бар
>>>


У меня недостаточно репутации, чтобы комментировать, но приведенный выше ответ неверен.

В Windows есть концепция рабочего каталога и рабочего диска. / трактуется как абсолютный путь к вашему текущему рабочему диску, так как в Windows нет концепции единого корня. В приведенном выше примере cd /FooBar идет к C:\foobar потому что рабочий диск - это C:, а не потому, что C: является "корневым" или каким-то особенным.

Вот пример:

C:\Users\user> cd /
C:\> d:
D:\> cd /Users
The system cannot find the path specified.
D:\> mkdir test
D:\> cd test
D:\test> cd c:/Users
D:\test> cd /
D:\> cd test
D:\test> c:
C:\Users\> d:
D:\test> 
Другие вопросы по тегам