Estoy tratando de aprender Python y estoy creando un programa que generará un script. Quiero usar os.path.join, pero estoy bastante confundido. Según los documentos si digo:
os.path.join('c:', 'sourcedir')
yo obtengo "C:sourcedir"
. Según los documentos, esto es normal, ¿verdad?
Pero cuando uso el comando copytree, Python lo generará de la forma 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] El sistema no puede encontrar la ruta especificada: 'C: src /*.*'
Si envuelvo el os.path.join
con os.path.normpath
, obtengo el mismo error.
Si esto 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 inclinadas no deben usarse en la combinación, eso es correcto, supongo.
fuente
os.path.join
oos.sep
si va a especificar dec:
todos modos?c:
no tiene sentido en otros sistemas operativos.os.path.join('c:','folder')
funciona de manera diferenteos.path.join('folder','file')
? ¿Es por:
o porque 'c: `es una unidad?Para ser aún más pedante, la respuesta más consistente de Python doc sería:
Dado que también necesita os.sep para la ruta raíz de posix:
fuente
os.sep
superior?os.sep
. Solo funciona después de la letra de unidad básica. >>> os.path.join ("C: \ adiós", os.sep, "temp") 'C: \\ temp'os.sep
es útil cuando desea manipular rutas sin hacer suposiciones sobre el separador. No tiene sentido usarloos.path.join()
ya que ya conoce el separador correcto. También es inútil si termina necesitando especificar explícitamente el directorio raíz por nombre (como puede ver en su propio ejemplo). ¿Por qué hacerlo en"c:" + os.sep
lugar de simplemente"c:\\"
o enos.sep + "usr"
lugar de simplemente"/usr"
? También tenga en cuenta que en los shells de Win no puede,cd c:
pero puedecd c:\
, lo que sugiere que el nombre raíz es en realidadc:\
.La razón por la
os.path.join('C:', 'src')
que no funciona como esperaba es debido a algo en la documentación a la que se vinculó:Como dijo el perro fantasma, probablemente quieras
mypath=os.path.join('c:\\', 'sourcedir')
fuente
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 ventanas:
En Linux:
fuente
c:
no existe en * nix, yusr
no existe en windows ..os.path.join(os.sep, rootdir + os.sep, targetdir)
es independiente del sistema precisamente porque funciona con ambos ejemplos específicos del sistema, sin necesidad de cambiar el código.rootdir = "usr" if nix else "c:"
. Pero el más directo y precisorootdir = "/usr" if nix else "c:\\"
funciona igual de bien, sin lasos.sep
acrobacias y el consiguiente rascado de cabeza. No hay peligro de que un directorio raíz en * nix comience con otra cosa que no sea una barra diagonal, o que Windows tenga directorios raíz nombrados sin dos puntos finales y una barra invertida (por ejemplo, en los shells de Win, no puede simplemente hacerlocd c:
, debería es necesario especificar la barra invertida al final), entonces, ¿por qué pretender lo contrario?Para ser pedante, probablemente no sea bueno codificar / o \ como separador de ruta. ¿Quizás esto sería lo mejor?
o
fuente
Yo diría que esto es un error de Python (Windows).
¿Por qué error?
Creo que esta declaración debería ser
True
Pero está
False
en máquinas con Windows.fuente
para unirse a una ruta de Windows, intente
Básicamente, tendrás que escapar de la barra
fuente
Tiene algunos enfoques posibles para tratar la ruta en Windows, desde los más codificados (como usar literales de cadena sin formato o escapar de barras diagonales inversas) hasta los menos. A continuación, se muestran algunos ejemplos que funcionarán como se esperaba. Utilice lo que mejor se adapte a sus necesidades.
fuente
Consentimiento con @ georg-
Diría entonces por qué necesitamos cojo
os.path.join
, mejor usarstr.join
o,unicode.join
por ejemplo,fuente
respondiendo a su comentario: "los otros '//' 'c:', 'c: \\' no funcionó (C: \\ creó dos barras invertidas, C: \ no funcionó en absoluto)"
En Windows, el uso
os.path.join('c:', 'sourcedir')
agregará automáticamente dos barras diagonales inversas\\
delante de sourcedir .Para resolver la ruta, ya que Python funciona en Windows también con barras diagonales -> '/' , simplemente agregue
.replace('\\','/')
conos.path.join
lo siguiente: -os.path.join('c:\\', 'sourcedir').replace('\\','/')
p.ej:
os.path.join('c:\\', 'temp').replace('\\','/')
salida: 'C: / temp'
fuente
Las soluciones propuestas son interesantes y ofrecen una buena referencia, sin embargo, solo satisfacen parcialmente. Está bien agregar manualmente el separador cuando tiene un solo caso específico o conoce el formato de la cadena de entrada, pero puede haber casos en los que desee hacerlo mediante programación en entradas genéricas.
Con un poco de experimentación, creo que el criterio es que el delimitador de ruta no se agrega si el primer segmento es una letra de unidad, es decir, una sola letra seguida de dos puntos, sin importar si corresponde a una unidad real.
Por ejemplo:
Una forma conveniente de probar los criterios y aplicar una corrección de ruta puede ser
os.path.splitdrive
comparar el primer elemento devuelto con el valor de prueba, comot+os.path.sep if os.path.splitdrive(t)[0]==t else t
.Prueba:
Probablemente se pueda mejorar para que sea más robusto para los espacios finales, y lo he probado solo en Windows, pero espero que dé una idea. Consulte también Os.path: ¿puede explicar este comportamiento? para obtener detalles interesantes sobre sistemas distintos de Windows.
fuente