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?

Gareth
fuente

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
joaquin
fuente
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"
S.Lott
fuente
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')
vaultah
fuente
-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.).

Ammar Alyousfi
fuente
-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

EP
fuente