Poniższy kod nie zostanie dołączony, podczas debugowania polecenie nie przechowuje całej ścieżki, ale tylko ostatni wpis.
os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')
Kiedy to testuję, zapisuje tylko /new_sandbox/
część kodu.
os.path.normpath
aby osiągnąć ten cel.Chodzi o
os.path.join()
to, aby uczynić swój program wieloplatformowym (Linux / Windows / etc).Nawet jedno cięcie go rujnuje.
Ma to więc sens tylko wtedy, gdy jest używany z jakimś punktem odniesienia, takim jak
os.environ['HOME']
lubos.path.dirname(__file__)
.źródło
os.path.join()
może być używany w połączeniu zos.path.sep
do tworzenia ścieżki bezwzględnej, a nie względnej.źródło
os.path.sep
jako pierwszego elementu do zbudowania absolutnej ścieżki jest lepsze niż jakakolwiek inna odpowiedź tutaj! Istotą używaniaos.path
raczej niż podstawowych metod str jest unikanie pisania/
. Świetne jest także umieszczenie każdego podkatalogu jako nowego argumentu i usunięcie wszystkich ukośników. Prawdopodobnie dobrym pomysłem byłoby upewnienie się, że czektodaystr
nie zaczyna się od ukośnika! ;)Nie używaj ukośników na początku komponentów ścieżki, z wyjątkiem odniesień do katalogu głównego:
patrz także: http://docs.python.org/library/os.path.html#os.path.join
źródło
Aby zrozumieć, dlaczego to zaskakujące zachowanie nie jest całkowicie okropne, rozważ aplikację, która akceptuje nazwę pliku konfiguracyjnego jako argument:
Jeśli aplikacja jest wykonywana za pomocą:
Plik konfiguracyjny
/etc/myapp.conf/foo.conf
zostanie użyty.Ale zastanów się, co się stanie, jeśli aplikacja zostanie wywołana z:
Następnie
myapp
należy użyć pliku konfiguracyjnego w/some/path/bar.conf
(i nie/etc/myapp.conf/some/path/bar.conf
lub podobnie).To może nie być świetne, ale uważam, że jest to motywacja do zachowania absolutnej ścieżki.
źródło
To dlatego, że
'/new_sandbox/'
zaczyna się od a,/
a zatem zakłada się, że jest względny w stosunku do katalogu głównego. Usuń wiodące/
.źródło
Aby uczynić twoją funkcję bardziej przenośną, użyj jej jako takiej:
lub
źródło
Wypróbuj kombinację ciągów
split("/")
i*
dla istniejących połączeń.Jak to działa...
split("/")
zamienia istniejącą ścieżkę na listę:['', 'home', 'build', 'test', 'sandboxes', '']
*
przed listą wyodrębnia każdy element listy swój własny parametrźródło
Spróbuj
new_sandbox
tylkoźródło
zrób to w ten sposób, bez dodatkowych cięć
źródło
Pamiętaj, że podobny problem może Cię ugryźć, jeśli użyjesz
os.path.join()
rozszerzenia, które już zawiera kropkę, co dzieje się automatycznie, gdy używaszos.path.splitext()
. W tym przykładzie:Chociaż
extension
może się zdarzyć, że.jpg
otrzymasz folder o nazwie „foobar” zamiast pliku o nazwie „foobar.jpg”. Aby temu zapobiec, musisz osobno dołączyć rozszerzenie:źródło
można :
strip
'/'
źródło
Zalecam usunięcie drugiego i następujących ciągów
os.path.sep
, zapobiegając interpretacji ich jako ścieżek bezwzględnych:źródło
pełniejsza wersja:
źródło
"\"
? Wtedy pojawia się twój pierwszy przykłados.path.join("a", *"/b".split("\\"))
, który daje"/b"
... Wątpię, żeby to był zamierzony rezultat.