Ścieżka Windows w Pythonie

152

Jaki jest najlepszy sposób reprezentowania na przykład katalogu Windows "C:\meshes\as"? Próbowałem zmodyfikować skrypt, ale nigdy nie działa, ponieważ nie mogę uzyskać prawidłowego katalogu, zakładam, że '\'działając jako znak ucieczki?

Gareth
źródło

Odpowiedzi:

220

zawsze możesz użyć:

'C:/mydir'

działa to zarówno w systemie Linux, jak i Windows. Jest inna możliwość

'C:\\mydir'

jeśli masz problemy z niektórymi nazwami, możesz również wypróbować surowe literały łańcuchowe:

r'C:\mydir'

jednak najlepszą praktyką jest użycie os.pathfunkcji modułu, które zawsze wybierają poprawną konfigurację dla twojego systemu operacyjnego:

os.path.join(mydir, myfile)

Od Pythona 3.4 możesz również użyć modułu pathlib . Jest to równoważne powyższemu:

pathlib.Path(mydir, myfile)

lub

pathlib.Path(mydir) / myfile
joaquin
źródło
2
@Gareth, jestem bardzo leniwy i często używam „/”. Jednak na dłuższą metę korzystanie z os.path jest wygodniejsze. Pozwala także na używanie mydir i myfile jako zmiennych, które można łatwo modyfikować.
joaquin
13
Jedyną rzeczą, na którą należy uważać na surowych strunach, jest to, że nie mogą kończyć się na \
Douglas Leeder
Możesz użyć os.path.join (), aby usunąć potrzebę kończenia ścieżek znakiem \.
Will Ediger,
1
Podoba mi się składnia r (nieprzetworzony łańcuch). Przydatne, jeśli kopiujesz długą ścieżkę, w której zwykle musiałbyś zastąpić wszystkie ukośniki odwrotne ukośnikami w przód
peterb
nieprzetworzony ciąg może kończyć się znakiem \\, więc możemy połączyć plik ze ścieżką: codecs.open (r "C: \ maXbox \ EKON24 \ tweet_data \\" + plik, 'r', encoding = 'utf-8') jako f:
Max Kleiner
20

Skorzystaj z os.pathmodułu.

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

Lub użyj surowych ciągów

r"C:\meshes\as"

Zalecałbym również brak spacji w ścieżce lub nazwach plików. I możesz użyć podwójnych odwrotnych ukośników w swoich strunach.

"C:\\meshes\\as.jpg"
S.Lott
źródło
11
os.path.join może nie zachowywać się zgodnie z oczekiwaniami, gdy składnik jest literą dysku, ponieważ ścieżki względne są dozwolone nawet wtedy. (Wynik pierwszej linii to „C: meshes \\ as” w systemie Windows.)
dash-tom-bang
Komentarz @ dash-tom-bang jest naprawdę ważny. Czy należy umieścić "C:\"jako pierwszy wpis? Czy to psuje trochę czystości użytkowania join?
Jack O'Connor,
1
@ JackO'Connor to właśnie robię. Na pewno nie chcesz umieszczać "C:\"w środku nazwy pliku. Poza tym możesz użyć os.path.normpathprzed lub po złączeniu, aby upewnić się, że ścieżka zostanie ładnie wydrukowana.
Agostino
ale to też nie działa. Co działaos.path.join( "C:\\", "meshes", "as" )
Jean-François Fabre
17

Tak, \w literałach łańcuchowych Pythona oznacza początek sekwencji ucieczki. Na swojej ścieżce masz prawidłową dwuznakową sekwencję ucieczki \a, która jest zwinięta do jednego znaku, którym jest ASCII Bell :

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

Inne typowe sekwencje specjalne to \t(tab \n), \r(znak nowego wiersza), (powrót karetki):

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

Jak widać, we wszystkich tych przykładach ukośnik odwrotny i następny znak literału zostały zgrupowane razem, tworząc pojedynczy znak w końcowym ciągu. Pełna lista sekwencji ucieczki Pythona znajduje się tutaj .

Można sobie z tym poradzić na wiele sposobów:

  1. Python nie będzie przetwarzał sekwencji ucieczki w literałach łańcuchowych poprzedzonych rlubR :

    >>> r'C:\meshes\as'
    'C:\\meshes\\as'
    >>> print(r'C:\meshes\as')
    C:\meshes\as
    
  2. Python w systemie Windows powinien również obsługiwać ukośniki.

  3. Możesz użyć os.path.join...

    >>> import os
    >>> os.path.join('C:', os.sep, 'meshes', 'as')
    'C:\\meshes\\as'
    
  4. ... lub nowszy pathlibmoduł

    >>> from pathlib import Path
    >>> Path('C:', '/', 'meshes', 'as')
    WindowsPath('C:/meshes/as')
    
Vaultah
źródło
-1

Użyj programu PowerShell

W systemie Windows możesz używać /ścieżki tak jak Linux lub macOS we wszystkich miejscach, o ile używasz PowerShell jako interfejsu wiersza poleceń. Jest preinstalowany w systemie Windows i obsługuje wiele poleceń systemu Linux, takich jak lspolecenie.

Jeśli korzystasz z wiersza polecenia systemu Windows (tego, który pojawia się po wpisaniu cmdw menu Start systemu Windows), musisz określić ścieżki zawierające \tylko wewnątrz. Możesz używać /ścieżek we wszystkich innych miejscach (edytor kodu, tryb interaktywny Python itp.).

Ammar Alyousfi
źródło
-1

Jeśli chcesz wkleić ścieżkę do okna z innego źródła (powiedzmy, Eksplorator plików) - możesz to zrobić przez input()wywołanie w konsoli Pythona:

>>> 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'

Następnie po prostu skopiuj wynik

EP
źródło