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.