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?

hulk007
źródło
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"))

Serban Razvan
źródło
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')
Alexander Kononenko
źródło
62

Możesz użyć os.sep :

>>> import os
>>> os.sep
'/'
Adem Öztaş
źródło
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.

Jon Rosen
źródło
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
Eugene Yarmash
źródło
16

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

Maroun
źródło
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
11

Zrób import osa następnie użyjos.sep

JackPoint
źródło
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)
P113305A009D8M
źródło
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)
mmmmmm
źródło