Коя библиотека на Python мога да използвам, за да извличам имена на файлове от пътища, без значение каква е операционната система или формата на пътя?
Например, бих искал всички тези пътища да ми връщат c
:
a/b/c/
a/b/c
\a\b\c
\a\b\c\
a\b\c
a/b/../../a/b/c/
a/b/../../a/b/c
Използването на os.path.split
или os.path.basename
, както предлагат другите, няма да работи във всички случаи: ако стартирате скрипта под Linux и се опитате да обработите класически път в стил Windows, той ще се провали.
Пътищата в Windows могат да използват обратна или права наклонена черта като разделител на пътя. Следователно модулът ntpath
(който е еквивалентен на os.path, когато се изпълнява под Windows) ще работи за всички(1) пътища на всички платформи.
import ntpath
ntpath.basename("a/b/c")
Разбира се, ако файлът завършва с наклонена черта, основното име ще бъде празно, така че създайте своя собствена функция, която да се справи с това:
def path_leaf(path):
head, tail = ntpath.split(path)
return tail or ntpath.basename(head)
Проверка:
>>> paths = ['a/b/c/', 'a/b/c', '\\a\\b\\c', '\\a\\b\\c\\', 'a\\b\\c',
... 'a/b/../../a/b/c/', 'a/b/../../a/b/c']
>>> [path_leaf(path) for path in paths]
['c', 'c', 'c', 'c', 'c', 'c', 'c']
(1) Има едно предупреждение: имената на файловете в Linux могат да съдържат обратни наклонени черти. Така че в Linux r'a/b\c'
винаги се отнася за файла b\c
в папката a
, докато в Windows винаги се отнася за файла c
в подпапката b
на папката a
. Така че, когато в пътя се използват както предни, така и задни наклонени черти, трябва да знаете свързаната платформа, за да можете да го интерпретирате правилно. На практика обикновено е безопасно да се приеме, че това е път за Windows, тъй като обратните наклонени черти рядко се използват в имената на файловете за Linux, но имайте това предвид, когато програмирате, за да не създавате случайни дупки в сигурността.
os.path.split е функцията, която търсите
head, tail = os.path.split("/tmp/d/a.dat")
>>> print(tail)
a.dat
>>> print(head)
/tmp/d
import os
head, tail = os.path.split(p)
print tail
Да приемем, че p е входният низ, а опашката е това, което искате.
Вижте python os module docs за подробности