example - python path windows
Python os.path.join en Windows (9)
Consentimiento con @ georg-
Diría entonces por qué necesitamos lame os.path.join
; es mejor usar str.join
o unicode.join
por ej.
sys.path.append(''{0}''.join(os.path.dirname(__file__).split(os.path.sep)[0:-1]).format(os.path.sep))
Estoy tratando de aprender Python y estoy haciendo un programa que generará un script. Quiero usar os.path.join, pero estoy bastante confundido. De acuerdo con los docs si digo:
os.path.join(''c:'', ''sourcedir'')
Me sale "C:sourcedir"
. Según los documentos, esto es normal, ¿verdad?
Pero cuando uso el comando copytree, Python lo generará de la manera deseada, por ejemplo:
import shutil
src = os.path.join(''c:'', ''src'')
dst = os.path.join(''c:'', ''dst'')
shutil.copytree(src, dst)
Aquí está el código de error que obtengo:
WindowsError: [Error 3] The system cannot find the path specified: ''C:src/*.*''
Si os.path.join
el os.path.join
con os.path.normpath
obtengo el mismo error.
Si este os.path.join
no se puede usar de esta manera, entonces estoy confundido en cuanto a su propósito.
De acuerdo con las páginas sugeridas por Stack Overflow, las barras no deberían usarse en la combinación, ¿es correcto, supongo?
La razón por la que os.path.join(''C:'', ''src'')
no está funcionando como espera es debido a algo en la documentación que ha vinculado:
Tenga en cuenta que en Windows, dado que hay un directorio actual para cada unidad, os.path.join ("c:", "foo") representa una ruta relativa al directorio actual en la unidad C: (c: foo), no c : / foo.
Como dijo ghostdog, probablemente quieras mypath=os.path.join(''c://', ''sourcedir'')
Para ser aún más pedante, la respuesta más consistente del doc. Python sería:
mypath = os.path.join(''c:'', os.sep, ''sourcedir'')
Como también necesita os.sep para la ruta de acceso raíz de posix:
mypath = os.path.join(os.sep, ''usr'', ''lib'')
Para ser pedante, probablemente no sea bueno codificar "/ /" como el separador de ruta. Tal vez esto sería lo mejor?
mypath = os.path.join(''c:%s'' % os.sep, ''sourcedir'')
o
mypath = os.path.join(''c:'' + os.sep, ''sourcedir'')
Para una solución independiente del sistema que funcione tanto en Windows como en Linux, sin importar la ruta de entrada, se podría usar os.path.join(os.sep, rootdir + os.sep, targetdir)
En WIndows:
>>> os.path.join(os.sep, "C:" + os.sep, "Windows")
''C://Windows''
En Linux:
>>> os.path.join(os.sep, "usr" + os.sep, "lib")
''/usr/lib''
Tiene algunos posibles enfoques para tratar la ruta en Windows, desde los más codificados (como el uso de literales de cadena sin formato o escapes de barras invertidas) hasta los menos. A continuación, se incluyen algunos ejemplos que funcionarán según lo esperado. Use lo que mejor se adapte a sus necesidades.
In[1]: from os.path import join, isdir
In[2]: from os import sep
In[3]: isdir(join("c:", "//", "Users"))
Out[3]: True
In[4]: isdir(join("c:", "/", "Users"))
Out[4]: True
In[5]: isdir(join("c:", sep, "Users"))
Out[5]: True
Windows tiene un concepto de directorio actual para cada unidad. Por eso, "c:sourcedir"
significa "sourcedir" dentro del directorio C: actual, y deberá especificar un directorio absoluto.
Cualquiera de estos debería funcionar y dar el mismo resultado, pero no tengo un Windows VM encendido en el momento para verificarlo:
"c:/sourcedir"
os.path.join("/", "c:", "sourcedir")
os.path.join("c:/", "sourcedir")
Yo diría que esto es un error (de Python) de Windows.
¿Por qué error?
Creo que esta declaración debe ser True
os.path.join(*os.path.dirname(os.path.abspath(__file__)).split(os.path.sep))==os.path.dirname(os.path.abspath(__file__))
Pero es False
en las máquinas de Windows.
para unirme a una ruta de Windows, pruebe
mypath=os.path.join(''c://', ''sourcedir'')
básicamente, tendrás que escapar de la barra oblicua