Po co używać os.path.join zamiast konkatenacji ciągów?

85

Myślę, że nie widzę tu szerszego obrazu; ale w zasadzie nie mam pojęcia, dlaczego miałbyś używać os.path.joinzamiast zwykłej konkatenacji ciągów?

Używałem głównie VBScript, więc nie rozumiem sensu tej funkcji.

user1905410
źródło

Odpowiedzi:

85

Przenośny

Napisz manipulacje ścieżkami plików raz i działa na wielu różnych platformach za darmo. Znak ograniczający zostaje usunięty, co ułatwia pracę.

Mądry

Nie musisz się już martwić, czy ta ścieżka katalogu miała końcowy ukośnik, czy nie . os.path.joindoda go, jeśli zajdzie taka potrzeba.

Jasny

Używanie os.path.joinsprawia, że ​​dla innych osób czytających Twój kod jest oczywiste, że pracujesz z ścieżkami plików. Ludzie mogą szybko przeskanować kod i odkryć, że jest to wewnętrzna ścieżka do pliku. Jeśli zdecydujesz się zbudować go samodzielnie, prawdopodobnie odciągniesz czytelnika od znalezienia rzeczywistych problemów z twoim kodem: „Hmm, jakieś konkrety ciągów znaków, zamiana. Czy to jest ścieżka do pliku, czy co? Ach! Dlaczego nie użył os.path.join?” :)

Społeczność
źródło
3
Dzięki. Części Smart i Clear są dokładnie tym rodzajem rozumowania, jakiego szukałem, zadając sobie to samo pytanie: część przenośną można łatwo uzyskać przez połączenie z "/" zamiast tylko "\" z oknami, więc jest to trochę dyskusyjne.
Léo Germond
3
punkt 3 ma wartość, ale 1 i 2 są dyskusyjne. / działa w systemie Windows. Jakiego systemu operacyjnego używasz, a który go nie obsługuje? A podwójne ukośniki na końcu są normalizowane przez system operacyjny / FS. Nie mówię, nie używaj os.path.join, ale jeśli to zrobisz, zrób to z właściwych powodów. Wokół os.path.join jest dużo kultywowania ładunków. „Głupia konsekwencja to hobgoblin małych umysłów”, jak mówią.
hraban
5

Będzie działać na Windows z '\' i Unix (w tym Mac OS X) z '/'.

dla posixpath oto prosty kod

In [22]: os.path.join??
Type:       function
String Form:<function join at 0x107c28ed8>
File:       /usr/local/Cellar/python/2.7.3/Frameworks/Python.framework/Versions/2.7/lib/python2.7/posixpath.py
Definition: os.path.join(a, *p)
Source:
def join(a, *p):
    """Join two or more pathname components, inserting '/' as needed.
    If any component is an absolute path, all previous path components
    will be discarded."""
    path = a
    for b in p:
        if b.startswith('/'):
            path = b
        elif path == '' or path.endswith('/'):
            path +=  b
        else:
            path += '/' + b
    return path

nie ma okien, ale powinno tam być to samo z '\'

locojay
źródło
5
O dziwo jednak, używanie /działa w systemie Windows z CPythonem…
Eric O Lebigot,
1
To. Dlaczego miałbyś próbować samodzielnie zajmować się separatorami ścieżek itp., Skoro istnieje funkcja zaprojektowana, aby zrobić to za Ciebie?
Blair,
1
Czytam komentarze i łączy to ze sobą ścieżki, po prostu nie rozumiem, dlaczego miałbym go kiedykolwiek używać, przepraszam, jak powiedziałem, wyraźnie nie widzę szerszego obrazu.
user1905410
@ user1905410 Robi więcej niż to, co obejmuje Dokumentacja Fine.
@ user1905410 Robi więcej niż to, czego wymaga Dokumentacja Fine.
0

Jest niezależny od systemu operacyjnego. Jeśli na stałe zakodujesz swoje ścieżki jako C: \ Cokolwiek, będą działać tylko w systemie Windows. Jeśli zakodujesz je na stałe w standardzie Uniksa "/", będą działać tylko na Uniksie. os.path.join wykrywa system operacyjny, w którym działa, i łączy ścieżki przy użyciu odpowiedniego symbolu.

bkaiser
źródło
7
If you hardcode them with the Unix standard "/" they will only work on Unix.To jest złe. „/” działa dobrze w systemie Windows ORAZ linux / unix / bsd / darwin.
Léo Germond