Ruta de Windows en Python


152

¿Cuál es la mejor manera de representar un directorio de Windows, por ejemplo "C:\meshes\as"? He estado tratando de modificar un script pero nunca funciona porque parece que no puedo entender bien el directorio, ¿supongo que por '\'actuar como un personaje de escape?

Respuestas:


220

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

r'C:\mydir'

Sin embargo, la mejor práctica es utilizar las os.pathfunciones 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 puede usar el módulo pathlib . Esto es equivalente a lo anterior:

pathlib.Path(mydir, myfile)

o

pathlib.Path(mydir) / myfile

2
@Gareth, soy muy vago y a menudo me encuentro 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.
joaquin

13
Lo único que debe tener cuidado con las cadenas en bruto es que no pueden terminar con \
Douglas Leeder

Puede usar os.path.join () para eliminar la necesidad de finalizar rutas con \.
Will Ediger

1
Me gusta la sintaxis r (cadena cruda). Es útil si está copiando una ruta larga donde generalmente tendría que reemplazar todas las barras diagonales inversas con barras diagonales
peterb

la cadena sin formato 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

20

Usa el os.pathmódulo.

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

O use cadenas crudas

r"C:\meshes\as"

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

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

11
os.path.join puede no comportarse como espera cuando un componente es una letra de unidad, ya que las rutas relativas están permitidas incluso en ese momento. (El resultado de la primera línea es 'C: mallas \\ as' en Windows.)
dash-tom-bang

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

1
@ JackO'Connor, eso es lo que hago. Ciertamente no desea poner "C:\"en el medio del nombre del archivo. Además, puede usar os.path.normpathantes o después de una unión, para asegurarse de que la ruta se imprima bien.
Agostino

Pero tampoco funciona. Lo que funciona esos.path.join( "C:\\", "meshes", "as" )
Jean-François Fabre

17

Sí, \en los literales de cadena de Python denota el inicio de una secuencia de escape. En su camino tiene una secuencia de escape válida de dos caracteres \a, que se contrae en un personaje 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(tabulación), \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 diagonal inversa y el siguiente carácter en el 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 formas de lidiar con eso:

  1. Python no procesará secuencias de escape en literales de cadena 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 módulo más nuevopathlib

    >>> from pathlib import Path
    >>> Path('C:', '/', 'meshes', 'as')
    WindowsPath('C:/meshes/as')

-1

Use PowerShell

En Windows, puede usar /en su ruta al igual que Linux o macOS en todos los lugares , siempre que use PowerShell como su interfaz de línea de comandos. Viene preinstalado en Windows y admite muchos comandos de Linux comols comando.

Si usa el símbolo del sistema de Windows (el que aparece cuando escribe cmden el menú Inicio de Windows), debe especificar rutas con \solo dentro. Puede usar /rutas en todos los demás lugares (editor de código, modo interactivo de Python, etc.).


-1

En caso de que desee pegar la ruta de Windows desde otra fuente (por ejemplo, Explorador de archivos), puede hacerlo mediante una input()llamada en la consola de Python:

>>> input()
D:\EP\stuff\1111\this_is_a_long_path\you_dont_want\to_type\or_edit_by_hand
'D:\\EP\\stuff\\1111\\this_is_a_long_path\\you_dont_want\\to_type\\or_edit_by_hand'

Luego solo copia el resultado

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.