Chemin Windows en Python

152

Quelle est la meilleure façon de représenter un répertoire Windows, par exemple "C:\meshes\as"? J'ai essayé de modifier un script mais cela ne fonctionne jamais parce que je n'arrive pas à obtenir le bon répertoire, je suppose à cause du '\'caractère d'échappement?

Gareth
la source

Réponses:

220

vous pouvez toujours utiliser:

'C:/mydir'

cela fonctionne à la fois sous Linux et Windows. L'autre possibilité 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, la meilleure pratique consiste à utiliser les os.pathfonctions du module 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
Joaquin
la source
2
@Gareth, je suis très paresseux et je me suis souvent retrouvé à utiliser '/'. Cependant, à long terme, l'utilisation de os.path est plus pratique. Il vous permet également d'utiliser mydir et myfile comme variables que vous pouvez facilement modifier.
joaquin
13
La seule chose à laquelle il faut faire attention sur les cordes brutes est qu'elles ne peuvent pas se terminer par \
Douglas Leeder
Vous pouvez utiliser os.path.join () pour supprimer la nécessité de terminer les chemins par \.
Will Ediger
1
J'aime la syntaxe r (chaîne brute). Utile si vous copiez un long chemin où vous devez généralement remplacer toutes les contre-obliques par des barres obliques
peterb
la chaîne brute peut se terminer par \\ afin que nous puissions concaténer un fichier au chemin: codecs.open (r "C: \ maXbox \ EKON24 \ tweet_data \\" + file, 'r', encoding = 'utf-8') comme f:
Max Kleiner
20

Utilisez le os.pathmodule.

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

Ou utilisez des chaînes brutes

r"C:\meshes\as"

Je recommanderais également aucun espace dans le chemin ou les noms de fichiers. Et vous pouvez utiliser des doubles barres obliques inverses dans vos chaînes.

"C:\\meshes\\as.jpg"
S.Lott
la source
11
os.path.join peut ne pas se comporter comme prévu lorsqu'un composant est une lettre de lecteur, car les chemins relatifs sont autorisés même dans ce cas. (Le résultat de la première ligne est 'C: meshes \\ as' sous Windows.)
dash-tom-bang
Le commentaire de @ dash-tom-bang est vraiment important. Est-ce que la bonne chose à faire est de mettre "C:\"comme première entrée? Est-ce que cela gâche une partie de la propreté de l'utilisation join?
Jack O'Connor
1
@ JackO'Connor c'est ce que je fais. Vous ne voulez certainement pas mettre "C:\"au milieu du nom de fichier. En outre, vous pouvez utiliser os.path.normpathavant ou après une jointure, pour vous assurer que le chemin est bien imprimé.
Agostino
mais ça ne marche pas non plus. Ce qui fonctionne estos.path.join( "C:\\", "meshes", "as" )
Jean-François Fabre
17

Oui, \en 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 de deux caractères \a, qui est réduite en un seul caractère qui est ASCII Bell :

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

D'autres séquences d'échappement courantes incluent \t(tabulation), \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 voir, dans tous ces exemples, la barre oblique inverse et le caractère suivant du littéral ont été regroupés pour former un seul caractère dans la chaîne finale. La liste complète des séquences d'échappement de Python est ici .

Il existe plusieurs façons de gérer cela:

  1. Python ne traitera pas les séquences d'échappement dans les littéraux de chaîne préfixés par rouR :

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

  3. Vous pourriez utiliser os.path.join...

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

    >>> from pathlib import Path
    >>> Path('C:', '/', 'meshes', 'as')
    WindowsPath('C:/meshes/as')
    
vaultah
la source
-1

Utiliser PowerShell

Sous Windows, vous pouvez utiliser /dans votre chemin comme Linux ou macOS dans tous les endroits, à condition d'utiliser PowerShell comme interface de ligne de commande. Il est pré-installé sur Windows et prend en charge de nombreuses commandes Linux comme la lscommande.

Si vous utilisez l'invite de commande Windows (celle qui apparaît lorsque vous tapez cmddans le menu Démarrer de Windows), vous devez spécifier les chemins avec \juste à l'intérieur. Vous pouvez utiliser des /chemins dans tous les autres endroits (éditeur de code, mode interactif Python, etc.).

Ammar Alyousfi
la source
-1

Si vous souhaitez coller le chemin Windows d'une autre source (par exemple, l'Explorateur de fichiers), vous pouvez le faire via un input()appel dans la console 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'

Ensuite, copiez simplement le résultat

EP
la source