¿Cómo debo escribir una ruta de Windows en un literal de cadena de Python?
Supongamos que necesito hacer referencia a la ruta C:\meshes\as
. Si intento escribir eso directamente, como "C:\meshes\as"
, encuentro problemas, ya sea alguna excepción o la ruta simplemente no funciona. ¿ Esto se debe a que \
actúa como un personaje de escape? ¿Cómo debo escribir los caminos?
Puedes usar siempre:
'C:/mydir'
Esto funciona tanto en Linux como en Windows.
Otra posibilidad es:
'C:\\mydir'
Si tiene problemas con algunos nombres, también puede probar con cadenas literales sin formato:
r'C:\mydir'
Sin embargo, la mejor práctica es utilizar las os.path
funciones del módulo que siempre se unen con el separador de ruta correcto ( os.path.sep
) para su sistema operativo:
os.path.join(mydir, myfile)
Desde Python 3.4 también puedes usar el pathlib
módulo. Esto es equivalente a lo anterior:
pathlib.Path(mydir, myfile)
o:
pathlib.Path(mydir) / myfile
Utilice el os.path
módulo.
os.path.join( "C:", "meshes", "as" )
O usar cuerdas crudas
r"C:\meshes\as"
También recomendaría que no haya espacios en la ruta ni en los nombres de los archivos. Y podrías usar barras invertidas dobles en tus cadenas.
"C:\\meshes\\as.jpg"
Sí, \
en Python, los literales de cadena denotan el inicio de una secuencia de escape. En su ruta tiene una secuencia de escape válida de dos caracteres \a
, que se contrae en un carácter que es ASCII Bell :
>>> '\a'
'\x07'
>>> len('\a')
1
>>> 'C:\meshes\as'
'C:\\meshes\x07s'
>>> print('C:\meshes\as')
C:\meshess
Otras secuencias de escape comunes incluyen \t
(tabulador), \n
(avance de línea), \r
(retorno de carro):
>>> list('C:\test')
['C', ':', '\t', 'e', 's', 't']
>>> list('C:\nest')
['C', ':', '\n', 'e', 's', 't']
>>> list('C:\rest')
['C', ':', '\r', 'e', 's', 't']
Como puede ver, en todos estos ejemplos la barra invertida y el siguiente carácter del literal se agruparon para formar un solo carácter en la cadena final. La lista completa de las secuencias de escape de Python está aquí .
Hay una variedad de maneras de lidiar con eso:
Python no procesará secuencias de escape en cadenas literales con el prefijo
r
oR
:>>> r'C:\meshes\as' 'C:\\meshes\\as' >>> print(r'C:\meshes\as') C:\meshes\as
Python en Windows también debería manejar barras diagonales.
Podrías usar
os.path.join
...>>> import os >>> os.path.join('C:', os.sep, 'meshes', 'as') 'C:\\meshes\\as'
... o el
pathlib
módulo más nuevo>>> from pathlib import Path >>> Path('C:', '/', 'meshes', 'as') WindowsPath('C:/meshes/as')
Usar Path
:
from pathlib import Path
data_folder = Path("source_data/text_files/")
file_to_open = data_folder / "raw_data.txt"
print(file_to_open.read_text())
Path
toma una cadena similar a una ruta y ajusta todo para el sistema operativo actual, ya sea Windows o Linux. Por ejemplo, en Linux convertiría todas las barras invertidas en barras diagonales y en Windows haría lo contrario.
Artículo completo: Consejo rápido de Python 3: la forma más sencilla de gestionar las rutas de archivos en Windows, Mac y Linux
Mi experiencia:
- Pasé 6 meses usando
os.path.join(...)
, luego cambié anormpath(...)
y finalmente cambié aPath(...)
. Habiendo usado los tres, Path es el mejor de todos los mundos.
Ventajas de Path sobre os.path.join(...)
:
- Limpiador.
- Menos escribir.
- Más fácil de leer las rutas (es decir, más legibles).
- Puede unir dos caminos diferentes usando
/
(ver arriba). - Más moderno.
Ventajas de Path sobre normpath(...)
:
- Puede unir rutas usando
/
en lugar de tener que recurrir aos.path.join(...)
, con llamadas de norma anidadas para arreglar las cosas. - Limpiador.
- Menos escribir.
- Más fácil de leer las rutas (es decir, más legibles).
- Menos posibilidades de que se produzcan errores al realizar la migración entre Linux y Windows.
- Más moderno.
La cadena sin formato de Python se crea anteponiendo un literal de cadena con 'r' o 'R'. La cadena sin formato de Python trata la barra invertida () como un carácter literal. Esto es útil cuando queremos tener una cadena que contenga una barra invertida y no queremos que se trate como un carácter de escape.
Haciendo manualmente como:
WindowsPath("C:\meshes\as")
o usando r o R:
WindowsPath(r'C:/meshes/as')