¿Cómo usar "/" (separador de directorios) en Linux y Windows en Python?

191

He escrito un código en Python que usa / para hacer un archivo en particular en una carpeta, si quiero usar el código en Windows no funcionará, ¿hay alguna manera de usar el código en Windows y Linux?

En python estoy usando este código:

pathfile=os.path.dirname(templateFile)
rootTree.write(''+pathfile+'/output/log.txt')

Cuando usaré mi código en una máquina Windows, mi código no funcionará.

¿Cómo uso "/" (separador de directorio) en Linux y Windows?

hulk007
fuente
1
Puede definirlo al principio dependiendo de Win / * nix y luego trabajar con la variable.
Fedorqui 'SO deja de dañar'
12
En Windows puede usar \ o / como separador de directorio.
SecurityMatt
12
Windows admite /en rutas de directorio. ¿Qué problema específico tienes? Publique un código que ilustre el problema.
Michael Geary
A menos que dependa de los programas de espacio de usuario de Windows, la barra diagonal funciona tanto como hacia atrás. Sin embargo, algunos comandos de cmd tienen problemas con eso.
Pihhan
1
@Mehrdad: ¿Conoces un ejemplo para el cual la API Win32 no acepta '/'? (sin contar cmd.exe y otros programas)
Eryk Sun

Respuestas:

266

Uso os.path.join(). Ejemplo: os.path.join(pathfile,"output","log.txt").

En su código eso sería: rootTree.write(os.path.join(pathfile,"output","log.txt"))

Serban Razvan
fuente
8
os.path.joinusa una lógica más compleja para unir varios componentes de ruta relativa. Cuando solo quieres encadenarlos, os.sep.joines la elección correcta.
Bachsau
108

Utilizar:

import os
print os.sep

para ver cómo se ve el separador en un sistema operativo actual.
En su código puede usar:

import os
path = os.path.join('folder_name', 'file_name')
Alexander Kononenko
fuente
62

Puedes usar os.sep :

>>> import os
>>> os.sep
'/'
Adem Öztaş
fuente
39

os.path.normpath(pathname)También debe mencionarse, ya que convierte los /separadores de ruta en \separadores en Windows. También se derrumba referencias redundantes de alta gama ... es decir, A/Be A/foo/../B, y A/./Btodos se convierten A/B. Y si eres Windows, todo esto se convierte A\B.

Jon Rosen
fuente
3
Esta es la mejor respuesta a la pregunta de IMO, ya que fue redactada, "cómo usar" / "(separador de directorio) en Linux y Windows". Y también es eminentemente útil: prefiero hacerlo os.path.normpath('a/b/c/d/file.ext')que os.path.join('a','b','c','d','file.ext')cuando necesito especificar un camino largo.
ukrutt
También encontré esta respuesta muy útil. Estaba buscando un método para generar rutas con un separador consistente. El famoso os.path.joinsimplemente se une a todo lo proporcionado. por ejemplo, join("a/b", "c\d")da a/b\c\d(en ventanas). Pero puedo obtener el resultado esperado con la combinación adecuada de joiny normpath, por ejemplo a\b\c\d(en Windows)
Sumudu
17

Si tiene la suerte de ejecutar Python 3.4+, puede usar pathlib:

from pathlib import Path

path = Path(dir, subdir, filename)  # returns a path of the system's path flavour

o equivalente,

path = Path(dir) / subdir / filename
Eugene Yarmash
fuente
16

Algunos enlaces útiles que te ayudarán:

Maroun
fuente
2
sendero Generalmente útil, pero no aquí, IMO.
glglgl
2
@glglgl De hecho. Busqué seppero no pude resistirme a publicar esto también (asumí que el OP lo encontrará útil para el trabajo futuro) :)
Maroun
11

Haz un import osy luego usaos.sep

JackPoint
fuente
8

Puedes usar " os.sep "

 import os
 pathfile=os.path.dirname(templateFile)
 directory = str(pathfile)+os.sep+'output'+os.sep+'log.txt'
 rootTree.write(directory)
P113305A009D8M
fuente
4

No construya los nombres de directorio y archivo usted mismo, use las bibliotecas incluidas de Python.

En este caso el relevante es os.path . Especialmente join, que crea un nuevo nombre de ruta a partir de un directorio y un nombre de archivo o directorio y divide que obtiene el nombre de archivo de una ruta completa.

Tu ejemplo sería

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
mmmmmm
fuente