web-dev-qa-db-fra.com

Chemin Windows dans Python

Quel est le meilleur moyen de représenter un répertoire Windows, par exemple "C:\meshes\as"? J'ai essayé de modifier un script, mais cela ne fonctionne jamais car je n'arrive pas à obtenir le répertoire correct, je suppose en raison du fait que le '\' joue le rôle de caractère d'échappement?

102
Gareth

vous pouvez toujours utiliser:

'C:/mydir'

cela fonctionne à la fois sous linux et windows. L'autre posibilité est

'C:\\mydir'

si vous rencontrez des problèmes avec certains noms, vous pouvez également essayer des littéraux de chaîne bruts:

r'C:\mydir'

cependant, il est recommandé d'utiliser les fonctions du module os.path qui sélectionnent toujours la configuration correcte pour votre système d'exploitation:

os.path.join(mydir, myfile)

Depuis python 3.4, vous pouvez également utiliser le module pathlib . Ceci est équivalent à ce qui précède:

pathlib.Path(mydir, myfile)

ou

pathlib.Path(mydir) / myfile
163
joaquin

Utilisez le module os.path.

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

Ou utilisez des chaînes brutes

r"C:\meshes\as"
13
S.Lott

Oui, _\_ dans Python les littéraux de chaîne indiquent le début d'une séquence d'échappement. Dans votre chemin, vous avez une séquence d'échappement valide à deux caractères _\a_, qui est réduite à un caractère qui est Clic ASCII :

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

Les autres séquences d'échappement courantes incluent _\t_ (onglet), _\n_ (saut de ligne), _\r_ (retour chariot):

_>>> list('C:\test')
['C', ':', '\t', 'e', 's', 't']
>>> list('C:\nest')
['C', ':', '\n', 'e', 's', 't']
>>> list('C:\rest')
['C', ':', '\r', 'e', 's', 't']
_

Comme vous pouvez le constater, dans tous ces exemples, la barre oblique inverse et le caractère suivant du littéral ont été regroupés pour ne former qu'un seul caractère dans la chaîne finale. La liste complète des séquences d'échappement de Python est ici .

Il y a différentes façons de gérer cela:

  1. Python ne traitera pas les séquences d'échappement dans les littéraux de chaîne précédés de r ou R :

    _>>> r'C:\meshes\as'
    'C:\\meshes\\as'
    >>> print(r'C:\meshes\as')
    C:\meshes\as
    _
  2. Python sous Windows devrait également gérer les barres obliques.

  3. Vous pouvez utiliser os.path.join ...

    _>>> import os
    >>> os.path.join('C:', os.sep, 'meshes', 'as')
    'C:\\meshes\\as'
    _
  4. ... ou le plus récent module pathlib

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