Почему бы не 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>