2010-03-11 13 views
58

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 la docs si digo:Python os.path.join en Windows

os.path.join('c:', 'sourcedir') 

me sale "C:sourcedir". Según los documentos, esto es normal, ¿verdad?

Pero cuando se utiliza el comando copytree, Python es la salida 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í es el código de error que consigo:

 
WindowsError: [Error 3] The system cannot find the path specified: 'C:src/*.*' 

Si envuelvo la os.path.join con os.path.normpath obtengo el mismo error.

Si este os.path.join no se puede utilizar de esta manera, entonces no estoy seguro de su propósito.

De acuerdo con las páginas sugeridas por Stack Overflow, no se deben usar barras en la unión — que es correcta, supongo?

Respuesta

33

Windows tiene un concepto de directorio actual para cada unidad. Por eso, "c:sourcedir" significa "fuente" dentro del directorio actual C: y deberá especificar un directorio absoluto.

Cualquiera de estos debe trabajar y dar el mismo resultado, pero no tengo una máquina virtual de Windows dispararon hasta en el momento que vuelva a comprobar:

"c:/sourcedir" 
os.path.join("/", "c:", "sourcedir") 
os.path.join("c:/", "sourcedir") 
+3

os.path.join ('C: /', 'sourcedir') funcionó como se esperaba. que muchas gracias :) buen señor los demás '//' 'c:' 'C: \\' no funcionaba (C: \\ creó dos barras invertidas, C: \ no lo hizo trabajo en absoluto) Gracias de nuevo ghostdog74, Smashery y Roger Pate. Estoy en deuda contigo :) –

+0

Lo sentimos, los saltos de línea no se mantuvieron en el comentario, parece muy desordenado –

3

para unirse a una ruta de Windows, intenta

mypath=os.path.join('c:\\', 'sourcedir') 

básicamente, tendrá que escapar de la barra

11

La razón os.path.join('C:', 'src') no está funcionando como se espera es debido a algo en la documentación que se conectó a:

Tenga en cuenta que en Windows, ya que existe 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, es probable que desee mypath=os.path.join('c:\\', 'sourcedir')

10

ser pedante, es probable que no es bueno para codificar cualquiera/o \ 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') 
73

Para ser aún más pedante, la respuesta coherente más pitón doc sería:

mypath = os.path.join('c:', os.sep, 'sourcedir') 

Dado que también necesita OS.sep para la ruta raíz de posix:

mypath = os.path.join(os.sep, 'usr', 'lib') 
+2

Esta es la respuesta correcta. –

4

Yo diría que esto es un error (de Windows) python.

¿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 máquinas Windows.

+1

Me inclino a aceptar que eso constituye un error de Python. ¿Sigue siendo así? (_ Escrito del glorioso futuro utópico de finales de 2015._) –

+0

No puedo responder esta pregunta con respecto a Windows, ya que no tengo acceso a una máquina de Windows, pero supongo que el comportamiento de Python con respecto a esta pregunta no ha cambiado. De todos modos, esta afirmación tampoco es cierta para las implementaciones de Linux, ya que la primera instrucción devuelve la ruta sin el separador principal (a.k.a el directorio raíz), mientras que la segunda declara la ruta incluyendo el separador principal. – georg

+0

Así que en realidad ya no me gusta mi respuesta con respecto a esta pregunta. Pero tampoco me gusta el comportamiento de Python con respecto a esto. – georg

0

de Consentimiento con @ Georg-

yo diría entonces ¿por qué tenemos que coja os.path.join - mejor utilizar str.join o unicode.join por ejemplo,

sys.path.append('{0}'.join(os.path.dirname(__file__).split(os.path.sep)[0:-1]).format(os.path.sep)) 
+0

Sí, claro, está más claro de esa manera. ¿Por qué no usar expresiones regulares mientras estás en ello? o llamar a un script de Perl y procesar la salida? –

0

usted tiene algunas posibles enfoques para el tratamiento de ruta en Windows, desde los más codificados (como el uso de cadenas literales primas o escapar las barras invertidas) a los menos queridos. 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