¿Por qué no os.path.join usa os.path.sep o os.sep?

Como sabemos, las ventanas aceptan tanto "\" como "/" como separador. Pero en python, se usa "\" . Por ejemplo, llame a os.path.join("foo","bar") , se devolverá 'foo\\bar' . Lo que es molesto es que hay un carácter de escape, por lo que no puede simplemente copiar la cadena de ruta y pegarla en la barra de ubicación del explorador.

Me pregunto si hay alguna forma de hacer que Python use "/" como separador predeterminado. He intentado cambiar el valor de os.path.sep y os.sep a "/" , pero os.path.join todavía usa "\\" .

cual es el camino correcto

PD:

Simplemente no entiendo por qué python usa “\” como separador predeterminado en Windows, ¿quizás la versión antigua de Windows no admita “/”?

¿Por qué no definir una función de visualización personalizada?

p.ej

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

Y si desea sustituir str.join por os.path.join , simplemente puede hacer esto ( str.join espera una sola lista, os.path.join espera *args ):

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

Quizás sería mejor dejar que Python normalice todo, luego reemplazar, por ejemplo:

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

El único problema con lo anterior podría estar en posix cuando hay un espacio en la ruta del archivo.

Luego, puede poner una statement if en la parte superior de su archivo utils y definir display_path y join como una no-op y como os.path.join respectivamente si no está en Windows.

Se trata de cómo Python detecta tu sistema operativo:

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

Por lo tanto, en Windows se ntpath módulo ntpath . Si verifica los módulos ntpath.py y posixpath.py , notará que ntpath.join() es un poco más complejo y eso también se debe a la razón que mencionó: Windows entiende / como un separador de ruta.

posixpath.join() : aunque puede usar posixpath.join() en Windows (siempre que los argumentos estén en formato POSIX ), no recomendaría hacerlo.

Para responder a su pregunta de la manera más simple posible, solo use posixpath en lugar de os.path.

Así que en lugar de:

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

Utilizar:

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

No recomendaría hacer esto.

Tenga en cuenta que si bien Windows también acepta la barra inclinada / como separador de ruta, tiene un significado diferente en algunos contextos.

Se trata como una ruta relativa usando cd , por ejemplo:

Línea de comando:

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

Aquí, / sustituye la letra de unidad.


Además, no veo ningún problema con la copia de las cadenas, ya que si print la cadena, la cadena se muestra como desea:

Intérprete de Python:

>>> import os
>>> imprimir os.path.join (“c: \”, “foo”, “bar”)
c: \ foo \ bar
>>>


No tengo suficiente reputación para comentar, pero la respuesta anterior es incorrecta.

Windows tiene un concepto de directorio de trabajo y unidad de trabajo. / se trata como una ruta absoluta en su unidad de trabajo actual , ya que Windows no tiene un concepto de raíz única. En el ejemplo anterior, cd /FooBar va a C:\foobar porque la unidad de trabajo es C :, no porque C: sea la unidad “raíz” o de alguna manera especial.

Aquí hay un ejemplo:

 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>