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

6 minutos de lectura

Avatar de usuario de Gareth
Gareth

¿Cuál es la mejor manera de representar un directorio de Windows, por ejemplo "C:\meshes\as"? He estado tratando de modificar una secuencia de comandos pero nunca funciona porque parece que no puedo obtener el directorio correcto, supongo que debido a la '\' actuando como personaje de escape?

  • Ver también: medio.com/swlh/…

    – Desbordamiento del servidor

    21 de marzo de 2022 a las 10:47

avatar de usuario de joaquín
joaquín

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 los literales de cadena sin procesar:

r'C:\mydir'

sin embargo, la mejor práctica es usar el os.path Funciones del módulo que siempre seleccionan la configuración correcta para su sistema operativo:

os.path.join(mydir, myfile)

Desde python 3.4 también puedes usar el rutalib módulo. Esto es equivalente a lo anterior:

pathlib.Path(mydir, myfile)

o

pathlib.Path(mydir) / myfile

  • @Gareth, soy muy perezoso y, a menudo, me encontré usando ‘/’. Sin embargo, a la larga, el uso de os.path es más conveniente. También le permite usar mydir y myfile como variables que puede modificar fácilmente.

    – joaquín

    1 de junio de 2010 a las 22:48

  • Lo único que hay que tener cuidado con las cadenas sin procesar es que no pueden terminar con \

    –Douglas Leeder

    29 de junio de 2010 a las 16:15

  • Puede usar os.path.join() para eliminar la necesidad de terminar las rutas con \.

    – Will Edger

    5 de agosto de 2014 a las 14:53

  • Me gusta la sintaxis r (cadena sin formato). Útil si está copiando una ruta larga donde normalmente tendría que reemplazar todas las barras invertidas con barras inclinadas

    – peterb

    21 de agosto de 2016 a las 5:07

  • la cadena sin procesar puede terminar con \\ para que podamos concatenar un archivo a la ruta: codecs.open(r”C:\maXbox\EKON24\tweet_data\\” + file, ‘r’, encoding=’utf-8′) como F:

    –Max Kleiner

    24 de junio de 2020 a las 13:34

Avatar de usuario de S. Lott
S. Lott

Utilizar el os.path módulo.

os.path.join( "C:", "meshes", "as" )

O usa cuerdas sin procesar

r"C:\meshes\as"

También recomendaría que no haya espacios en la ruta o en los nombres de los archivos. Y podría usar barras invertidas dobles en sus cadenas.

"C:\\meshes\\as.jpg"

  • os.path.join puede no comportarse como espera cuando un componente es una letra de unidad, ya que incluso entonces se permiten rutas relativas. (El resultado de la primera línea es ‘C:mallas\\as’ en Windows).

    – dash-tom-bang

    1 de junio de 2010 a las 23:04


  • El comentario de @ dash-tom-bang es muy importante. ¿Es lo correcto hacer para poner "C:\" como la primera entrada? ¿Eso estropea un poco la limpieza del uso? join?

    – Jack O´Connor

    21 de febrero de 2014 a las 0:53

  • @ JackO’Connor eso es lo que hago. Seguro que no quieres poner "C:\" en medio del nombre del archivo. Además, puedes usar os.path.normpath antes o después de una unión, para asegurarse de que la ruta se imprima correctamente.

    – Agostino

    07/04/2015 a las 18:03


  • pero tampoco funciona. lo que funciona es os.path.join( "C:\\", "meshes", "as" )

    – Jean-François Fabre

    2 de marzo de 2019 a las 11:32


  • @JackO’Connor, ¿estás tratando con Windows y te preocupa la limpieza? 😉

    – Jürgen A. Erhard

    8 de agosto de 2021 a las 9:36

avatar de usuario de vaultah
bóveda

Sí, \ en los literales de cadena de Python indica el inicio de una secuencia de escape. En su camino tiene una secuencia de escape válida de dos caracteres \aque se colapsa en uno personaje que es Campana ASCII:

>>> '\a'
'\x07'
>>> len('\a')
1
>>> 'C:\meshes\as'
'C:\\meshes\x07s'
>>> print('C:\meshes\as')
C:\meshess

Otras secuencias de escape comunes incluyen \t (pestaña), \n (linea de alimentación), \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 secuencias de escape de Python es aquí.

Hay una variedad de maneras de lidiar con eso:

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

    >>> 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 más nuevo pathlib módulo

    >>> from pathlib import Path
    >>> Path('C:', "https://stackoverflow.com/", 'meshes', 'as')
    WindowsPath('C:/meshes/as')
    

Avatar de usuario de Contango
Aplazamiento de pago

Utilizar 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 inclinadas, y en Windows haría lo contrario.

Articulo completo: Sugerencia rápida de Python 3: la manera fácil de manejar rutas de archivos en Windows, Mac y Linux


Mi experiencia:

  • Pasé 6 meses usando os.path.join(...)luego cambió a normpath(...) luego 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 tipeo.
  • Más fácil de leer las rutas (es decir, más legible).
  • Puede unir dos caminos diferentes usando / (véase más arriba).
  • Más moderno.

Ventajas del camino sobre normpath(...):

  • Puede unir caminos usando / en lugar de tener que volver a caer os.path.join(...)con llamadas de ruta de norma anidadas para arreglar las cosas.
  • Limpiador.
  • Menos tipeo.
  • Más fácil de leer las rutas (es decir, más legible).
  • Menos posibilidades de errores al realizar la migración entre Linux y Windows.
  • Más moderno.

La cadena sin procesar de Python se crea anteponiendo un literal de cadena con ‘r’ o ‘R’. La cadena sin procesar 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.

Hacer manualmente tales como:

WindowsPath("C:\meshes\as")

o usando r o R:

WindowsPath(r'C:/meshes/as')

¿Ha sido útil esta solución?