2010-04-18 13 views
9

Mam kilka skryptów, które pobierają nazwę katalogu, a mój program tworzy pliki w tych katalogach. Czasem chcę pobrać baseame z katalogu podanego do programu i użyć go do tworzenia różnych plików w katalogu. Na przykład,Elegancki sposób na pobranie nazwy katalogu w Pythonie?

# directory name given by user via command-line 
output_dir = "..." # obtained by OptParser, for example 
my_filename = output_dir + '/' + os.path.basename(output_dir) + '.my_program_output' 
# write stuff to my_filename 

Problemem jest to, że jeśli użytkownik podaje nazwę katalogu z ukośnika, wtedy os.path.basename zwróci pusty ciąg znaków, który jest nie to, co chcę. Jaki jest najbardziej elegancki sposób radzenia sobie z tymi slash/końcowymi problemami slasha w pythonie? Wiem, że mogę ręcznie sprawdzić ukośnik na końcu output_dir i usunąć go, jeśli tam jest, ale wydaje się, że powinien istnieć lepszy sposób. Jest tu?

Czy można również ręcznie dodawać znaki "/"? Na przykład. output_dir + '/' os.path.basename() lub czy istnieje bardziej ogólny sposób budowania ścieżek?

Dzięki.

Odpowiedz

15

Aby rozwiązać problem z "końcowym ukośnikiem" (i innymi problemami!), Należy odświeżyć dane wprowadzane przez użytkownika za pomocą os.path.normpath().

Aby zbudować ścieżki, użyj os.path.join()

1

Ręczne budowanie ścieżek to zły pomysł na przenośność; będzie pękać w systemie Windows. Powinieneś użyć os.path.sep.

Co do pierwszego pytania, dobrym pomysłem jest użycie os.path.join.

+1

„” „będzie przerwa na Windows” „”: m.in. ukośniki złamie tylko jeśli karmisz go jako części polecenia na przykład 'os.system()'; parser poleceń DOS rozumie tylko ukośniki odwrotne. Karmienie go np. open() jest całkiem w porządku. Jeśli jednak skonstruowana ścieżka zostanie kiedykolwiek wyświetlona użytkownikowi systemu Windows lub administratorowi, przygotuj się na wiele błędów :-) –

7

Użyj os.path.join() do budowania ścieżek. Na przykład:

>>> import os.path 
>>> path = 'foo/bar' 
>>> os.path.join(path, 'filename') 
'foo/bar/filename' 
>>> path = 'foo/bar/' 
>>> os.path.join(path, 'filename') 
'foo/bar/filename' 
1

budować ścieżki bez pisania tnie lepiej jest użyć:

os.path.join(dir, subdir, file) 

jeśli chcesz dodać separatory lub dostać separator independly systemu operacyjnego, a następnie użyć

os.sep 
+0

, zgodnie z OP, problem polega na tym, że jeśli d jest "mydir", to zwróci pusty ciąg znaków. –

+0

@Ofri: odpowiednia sekcja została wyeliminowana. – joaquin

2

Powinieneś użyć os.path.join(), aby dodać ścieżki razem.

zastosowanie

os.path.dirname(os.path.join(output_dir,'')) 

wyodrębnić dirname, dodając ukośnika, jeśli pominięto.

Powiązane problemy