¿Por qué usar os.path.join sobre la concatenación de cadenas?
81
Creo que no puedo ver el panorama completo aquí; pero básicamente no tengo idea de por qué usarías en os.path.joinlugar de la concatenación de cadenas normal.
He usado principalmente VBScript, así que no entiendo el sentido de esta función.
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?" :)
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:
defjoin(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 '\'
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.
Respuestas:
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.join
lo agregará si es necesario.Claro
El uso
os.path.join
hace 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
?" :)fuente
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.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 '\'
fuente
/
funciona en Windows, con CPython…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.
fuente
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.