example python windows path-manipulation

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