¿Por qué usar os.path.join sobre la concatenación de cadenas?

Respuestas:

80

Portátil

Escriba manipulaciones de ruta de archivo una vez y funciona en muchas plataformas diferentes, de forma gratuita. El carácter delimitador se abstrae, facilitando su trabajo.

Inteligente

Ya no necesita preocuparse si esa ruta de directorio tiene una barra al final o no . os.path.joinlo agregará si es necesario.

Claro

El uso os.path.joinhace que sea obvio para otras personas que lean su código que está trabajando con rutas de archivo. Las personas pueden escanear rápidamente el código y descubrir que es una ruta de archivo intrínsecamente. Si decide construirlo usted mismo, probablemente distraiga al lector de encontrar problemas reales con su código: "Hmm, algunas cadenas de caracteres, una sustitución. ¿Es una ruta de archivo o qué? ¡Gah! ¿Por qué no usó os.path.join?" :)

Comunidad
fuente
3
Gracias. Las partes Smart y Clear son exactamente el tipo de razonamiento que estaba buscando cuando me hice la misma pregunta: la parte portátil se logra fácilmente mediante la concatenación con "/" en lugar de solo Windows "\", por lo que es algo discutible.
Léo Germond
3
el punto 3 tiene mérito, pero 1 y 2 son discutibles. / funciona en Windows. ¿Qué sistema operativo usas que no lo admite? Y el OS / FS normaliza las barras dobles finales. No estoy diciendo que no lo use os.path.join, pero si lo hace, hágalo por las razones correctas. Hay mucha carga-culting alrededor de os.path.join. "Una consistencia tonta es el duende de las mentes pequeñas", como dicen.
hraban
5

Funcionará en Windows con '\' y Unix (incluido Mac OS X) con '/'.

para posixpath aquí está el código sencillo

In [22]: os.path.join??
Type:       function
String Form:<function join at 0x107c28ed8>
File:       /usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py
Definition: os.path.join(a, *p)
Source:
def join(a, *p):
    """Join two or more pathname components, inserting '/' as needed.
    If any component is an absolute path, all previous path components
    will be discarded."""
    path = a
    for b in p:
        if b.startswith('/'):
            path = b
        elif path == '' or path.endswith('/'):
            path +=  b
        else:
            path += '/' + b
    return path

no tengo ventanas pero lo mismo debería estar ahí con '\'

locojay
fuente
5
Sin embargo, por extraño que parezca, el uso /funciona en Windows, con CPython…
Eric O Lebigot
1
Esta. ¿Por qué trataría de manejar los separadores de ruta, etc. usted mismo cuando hay una función diseñada para hacerlo por usted?
Blair
1
Leí los comentarios y une caminos juntos, simplemente no puedo ver por qué lo usaría alguna vez, disculpas como dije, claramente no estoy viendo el panorama general.
user1905410
@ user1905410 Hace más que eso, como cubre la Documentación fina.
@ user1905410 Hace más que eso, como lo establece la Documentación fina.
0

Es independiente del sistema operativo. Si codifica sus rutas como C: \ Whatever, solo funcionarán en Windows. Si los codifica con el estándar Unix "/", solo funcionarán en Unix. os.path.join detecta el sistema operativo bajo el que se está ejecutando y une las rutas usando el símbolo correcto.

bkaiser
fuente
7
If you hardcode them with the Unix standard "/" they will only work on Unix.Eso está mal. "/" funciona bien en windows y linux / unix / bsd / darwin.
Léo Germond