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>