¿Concatenación de ruta independiente de la plataforma usando “/”, “\”?

4 minutos de lectura

avatar de usuario
Jakub M.

En python tengo variables base_dir y filename. Me gustaría concatenarlos para obtener fullpath. Pero debajo de las ventanas debería usar \ y para POSIX / .

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

¿Cómo puedo hacer que esta plataforma sea independiente?

  • posible duplicado de rutas de archivos independientes de la plataforma?

    – Félix Kling

    6 de junio de 2012 a las 16:59

  • ¿Posible duplicado de rutas de archivos independientes de la plataforma?

    – jww

    24 de agosto de 2019 a las 5:55

  • Consulte también esta respuesta sobre ¿Por qué usar os.path.join sobre la concatenación de cadenas?

    – danicotra

    16 de mayo de 2020 a las 9:27

avatar de usuario
levon

quieres usar os.path.join() para esto.

La ventaja de usar esto en lugar de la concatenación de cadenas, etc. es que es consciente de los diversos problemas específicos del sistema operativo, como los separadores de ruta. Ejemplos:

import os

Por debajo ventanas 7:

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

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

Por debajo linux:

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

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

los sistema operativo El módulo contiene muchos métodos útiles para el directorio, la manipulación de rutas y la búsqueda de información específica del sistema operativo, como el separador utilizado en las rutas a través de os.sep

avatar de usuario
andres clark

Usar os.path.join():

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

los os.ruta El módulo contiene todos los métodos que debe necesitar para la manipulación de rutas independientes de la plataforma, pero en caso de que necesite saber cuál es el separador de ruta en la plataforma actual, puede usar os.sep.

  • No lo es completo camino si base_dir es una ruta relativa (a pesar de que OP la usa)

    – jfs

    6 de junio de 2012 a las 17:01

  • Agregar un abspath() la llamada debe convertirla en una ruta completa si hay algo relativo en ella.

    – martineau

    6 de junio de 2012 a las 17:42

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

    – multibuenverso

    11 de febrero de 2015 a las 10:46


Desenterrar una vieja pregunta aquí, pero en Python 3.4+ puedes usar operadores pathlib:

from pathlib import Path

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

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

  • soy muy aficionado pathlib. Sin embargo, a menudo no se instala de forma predeterminada en las instalaciones de Python2. Si no desea que los usuarios tengan que pasar por la instalación de pathlib también, os.path.join() es la forma más sencilla de hacerlo.

    –Marcel Waldvogel

    16 de junio de 2019 a las 12:58

  • los / operador es conveniente cuando se trabaja con objetos existentes. Cuando usa el constructor directamente, puede simplemente pasar varios argumentos para construir la ruta. es decir Path("./src", "cool-code", "coolest-code.py")

    – Tomerikoo

    29 de junio a las 8:14

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

He hecho una clase auxiliar 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

  • ¿Esto no insertará barras invertidas en Windows?

    –Marcel Waldvogel

    16 de junio de 2019 a las 12:58

avatar de usuario
mik r

Gracias por esto. Para cualquier otra persona que vea esto usando fbs o pyinstaller y aplicaciones congeladas.

Puedo usar el siguiente que funciona perfecto ahora.

target_db = os.path.join(os.path.abspath(os.path.dirname(sys.argv[0])), "sqlite_example.db")

Estaba haciendo esta fealdad antes de lo cual obviamente no era lo ideal.

if platform == 'Windows':
    target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "\\" + "sqlite_example.db")

if platform == 'Linux' or 'MAC':
    target_db = (os.path.abspath(os.path.dirname(sys.argv[0])) + "https://stackoverflow.com/" + "sqlite_example.db")

target_db_path = target_db
print(target_db_path)

  • ¿Esto no insertará barras invertidas en Windows?

    –Marcel Waldvogel

    16 de junio de 2019 a las 12:58

¿Ha sido útil esta solución?