Jak używać „/” (separatora katalogów) w systemie Linux i Windows w Pythonie?


191

Napisałem kod w Pythonie, który używa / do utworzenia określonego pliku w folderze, jeśli chcę użyć kodu w systemie Windows, to nie zadziała, czy istnieje sposób, dzięki któremu mogę użyć kodu w systemie Windows i Linux.

W python używam tego kodu:

pathfile=os.path.dirname(templateFile)
rootTree.write(''+pathfile+'/output/log.txt')

Kiedy użyję mojego kodu w przypuszczeniu, że komputer z systemem Windows mój kod nie będzie działać.

Jak korzystać z „/” (separatora katalogów) w systemie Linux i Windows?


1
Możesz zdefiniować go na początku w zależności od Win / * nix, a następnie pracować ze zmienną.
fedorqui „SO przestań szkodzić”

12
W systemie Windows możesz użyć \ lub / jako separatora katalogów.
SecurityMatt

12
System Windows obsługuje /ścieżki katalogów. Jaki masz konkretny problem? Opublikuj kod ilustrujący problem.
Michael Geary

O ile nie jesteś zależny od programów przestrzeni użytkownika Windows, ukośnik działa tak samo jak wstecz. Jednak niektóre polecenia cmd mają z tym problem.
Pihhan

1
@Mehrdad: Czy znasz przykład, dla którego Win32 API nie akceptuje „/”? (nie licząc cmd.exe i innych programów)
Eryk Sun

Odpowiedzi:


268

Zastosowanie os.path.join(). Przykład: os.path.join(pathfile,"output","log.txt").

W twoim kodzie byłoby to: rootTree.write(os.path.join(pathfile,"output","log.txt"))


9
os.path.joinużywa bardziej złożonej logiki, aby dopasować kilka względnych komponentów ścieżki razem. Gdy chcesz je po prostu połączyć, os.sep.joinjest właściwym wyborem.
Bachsau,

108

Posługiwać się:

import os
print os.sep

aby zobaczyć, jak wygląda separator w bieżącym systemie operacyjnym.
W swoim kodzie możesz użyć:

import os
path = os.path.join('folder_name', 'file_name')


39

os.path.normpath(pathname)należy również wspomnieć, ponieważ konwertuje /separatory ścieżek na \separatory w systemie Windows. Wali również zbędne odnośniki uplevel ... IE, A/Ba A/foo/../Bi A/./Bwszystko stać A/B. A jeśli jesteś Windows, wszystkie one stają się A\B.


3
To jest IMO najlepsza odpowiedź na pytanie, jak zostało sformułowane: „jak używać„ / ”(separator katalogów) zarówno w systemie Linux, jak i Windows”. Jest to również niezwykle przydatne - wolałbym raczej os.path.normpath('a/b/c/d/file.ext')niż os.path.join('a','b','c','d','file.ext')wtedy, gdy muszę określić długą ścieżkę.
ukrutt

Uznałem również, że ta odpowiedź jest bardzo pomocna. Szukałem metody generowania ścieżek ze spójnym separatorem. Słynny os.path.joinpo prostu dołącza do wszystkiego. np. join("a/b", "c\d")daje a/b\c\d(w systemie Windows). Ale mogę uzyskać oczekiwany wynik z właściwą kombinację joini normpath, na przykład a\b\c\d(w systemie Windows)
Sumudu

17

Jeśli masz szczęście, że korzystasz z Python 3.4+, możesz użyć pathlib:

from pathlib import Path

path = Path(dir, subdir, filename)  # returns a path of the system's path flavour

lub równoważnie

path = Path(dir) / subdir / filename

16

Kilka przydatnych linków, które pomogą Ci:


2
Pathsep? Ogólnie przydatne, ale nie tutaj, IMO.
glglgl

2
@glglgl Rzeczywiście. Szukałem, sepale też nie mogłem się oprzeć, aby to opublikować (założyłem, że OP uzna to za przydatne do przyszłych prac) :)
Maroun


8

Możesz użyć „ os.sep

 import os
 pathfile=os.path.dirname(templateFile)
 directory = str(pathfile)+os.sep+'output'+os.sep+'log.txt'
 rootTree.write(directory)

4

Nie twórz własnych nazw katalogów i plików, używaj bibliotek dołączonych do Pythona.

W tym przypadku odpowiednią jest os.path . Zwłaszcza łączyć, która tworzy nową nazwę ścieżki z katalogu i nazwę pliku lub katalogu i podział, który pobiera nazwę pliku z pełnej ścieżki.

Twój przykład byłby

pathfile=os.path.dirname(templateFile)
p = os.path.join(pathfile, 'output')
p = os.path.join( p, 'log.txt')
rootTree.write(p)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.