2012-06-06 18 views
36

En python tengo variables base_dir y filename. Me gustaría concatenarlos para obtener fullpath. Pero bajo windows debería usar \ y para POSIX /.ruta de concatenación - plataforma independiente - "/", ""

fullpath = "%s/%s" % (base_dir, filename) # for Linux 

¿Cómo hacer que la plataforma sea independiente?

Duplicar: Platform-independent file paths?

+0

posible duplicado de [¿rutas de archivos independientes de la plataforma?] (Http://stackoverflow.com/questions/6036129/platform-independent-file-paths) –

Respuesta

72

Usted desea utilizar para este os.path.join().

La fuerza del uso de esta concatenación de cadenas en lugar de cadena es que es consciente de los diversos problemas específicos del sistema operativo, como los separadores de rutas. Ejemplos:

import os 

Bajo Windows 7:

base_dir = r'c:\bla\bing' 
filename = r'data.txt' 

os.path.join(base_dir, filename) 
'c:\\bla\\bing\\data.txt' 

Bajo Linux:

base_dir = '/bla/bing' 
filename = 'data.txt' 

os.path.join(base_dir, filename) 
'/bla/bing/data.txt' 

El módulo os contiene muchos métodos útiles para el directorio, la manipulación camino y descubrir OS información específica, como el separador utilizado en las rutas a través del os.sep

+3

Aunque, Windows acepta barras diagonales también. – multigoodverse

17

Uso os.path.join():

import os 
fullpath = os.path.join(base_dir, filename) 

El módulo os.path contiene todos los métodos que usted debe necesitar para la plataforma de manipulación camino independiente, pero en caso de que necesita saber lo que el separador de ruta está en la plataforma actual, puede use os.sep.

+1

no es una ruta * completa * si 'base_dir' es una ruta relativa (a pesar de que OP lo usa) – jfs

+1

Agregar una llamada' abspath() 'debería convertirla en una ruta completa si hay algo relativo en ella. – martineau

+0

@Andrew Clark, os.sep devuelve "\\" en Windows, pero aún funciona incluso si uso "/". ¿Hay algún problema si solo usamos "/"? – multigoodverse

3
import os 
path = os.path.join("foo", "bar") 
path = os.path.join("foo", "bar", "alice", "bob") # More than 2 params allowed. 
0

que he tomado una clase de ayuda para esto:

import os 

class u(str): 
    """ 
     Class to deal with urls concat. 
    """ 
    def __init__(self, url): 
     self.url = str(url) 

    def __add__(self, other): 
     if isinstance(other, u): 
      return u(os.path.join(self.url, other.url)) 
     else: 
      return u(os.path.join(self.url, other)) 

    def __unicode__(self): 
     return self.url 

    def __repr__(self): 
     return self.url 

El uso es:

a = u("http://some/path") 
    b = a + "and/some/another/path" # http://some/path/and/some/another/path 
2

Desenterrando una vieja cuestión aquí, pero en Python 3.4+ puede utilizar pathlib operators:

from pathlib import Path 

# evaluates to ./src/cool-code/coolest-code.py on Mac 
concatenated_path = Path("./src")/"cool-code\\coolest-code.py" 

It Es potencialmente más legible que os.path.join() si tiene la suerte de estar ejecutando una versión reciente de Python. Pero también compensa la compatibilidad con las versiones anteriores de Python si debe ejecutar su código, por ejemplo, en un entorno rígido o heredado.

Cuestiones relacionadas