¿Cómo debo escribir una ruta de Windows en un literal de cadena de Python?

Resuelto Gareth asked hace 14 años • 5 respuestas

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?

Gareth avatar Jun 02 '10 05:06 Gareth
Aceptado

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.pathfunciones 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 pathlibmódulo. Esto es equivalente a lo anterior:

pathlib.Path(mydir, myfile)

o:

pathlib.Path(mydir) / myfile
joaquin avatar Jun 01 '2010 22:06 joaquin

Utilice el os.pathmó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.Lott avatar Jun 01 '2010 22:06 S.Lott

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:

  1. Python no procesará secuencias de escape en cadenas literales con el prefijo roR :

    >>> r'C:\meshes\as'
    'C:\\meshes\\as'
    >>> print(r'C:\meshes\as')
    C:\meshes\as
    
  2. Python en Windows también debería manejar barras diagonales.

  3. Podrías usar os.path.join...

    >>> import os
    >>> os.path.join('C:', os.sep, 'meshes', 'as')
    'C:\\meshes\\as'
    
  4. ... o el pathlibmódulo más nuevo

    >>> from pathlib import Path
    >>> Path('C:', '/', 'meshes', 'as')
    WindowsPath('C:/meshes/as')
    
vaultah avatar Mar 31 '2018 12:03 vaultah

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())

Pathtoma 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é a normpath(...)y finalmente cambié a Path(...). 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 a os.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.
Contango avatar Jul 03 '2021 08:07 Contango

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')
Shoaib Muhammad Arif avatar Jul 28 '2021 06:07 Shoaib Muhammad Arif