Получение конца пути к файлу - PullRequest
4 голосов
/ 22 августа 2011

Я не могу найти эффективный способ сделать это.Лучший способ описать то, что я пытаюсь сделать, - это на примере, поэтому, куда мы идем (при условии, что / bar / является родителем):

C:\foo\bar\baz\text.txt

будет моим путем.Меня интересует все, вплоть до родительского каталога верхнего уровня пути.Что мне нужно, это скрипт, который будет делать именно это.Другими словами, я хочу только захватить

\bar\baz\text.txt

Сплит не работает для меня.Он разделит файл и путь, но не даст такой вывод.Мне не хватает встроенной функции или я SOL?Спасибо!

Ответы [ 7 ]

1 голос
/ 22 августа 2011

Не уверен, что вы хотите, но вы можете использовать малоизвестный rsplit , который разделяется с правой стороны строки.

>>> filepath = r"C:\foo\bar\baz\text.txt"
>>> directories_deep = 3
>>> os.path.sep.join(filepath.rsplit(os.path.sep, directories_deep)[-directories_deep:])
'bar\\baz\\text.txt'
1 голос
/ 18 августа 2017

Я создал вспомогательную функцию, которая выполняет работу:

import os
def get_path_tail(path, tail_length = 1):
    assert isinstance(tail_length, int)
    if tail_length == 1:
        return path.split('/')[-tail_length]
    elif tail_length > 1:
        return os.path.join(*path.split('/')[-tail_length:])

Поведение:

>>> path = os.path.join('C:','foo','bar', 'baz','text.txt')
>>> print get_path_tail(path, tail_length = 3)

    bar/baz/text.txt

Его подпись такая же, как в ответе из ForeverWintr , но я не смог прокомментировать его ответ, так как у меня пока недостаточно репутации.:)

1 голос
/ 22 августа 2011

Я не уверен, что вы имеете в виду, когда говорите "родительский каталог верхнего уровня". Ваш каталог верхнего уровня - C:\. Родитель чего? Если вы пытаетесь получить относительный путь, который начинается с родителя вашего текущего рабочего каталога, попробуйте это:

import os.path
os.path.relpath("C:\\foo\\bar\\baz\\text.txt", os.path.dirname(os.path.realpath('..')))
1 голос
/ 22 августа 2011

Вы всегда можете использовать string.split():

>>> print '\\' + path.split('\\', 2)[-1]
\bar\baz\text.txt
0 голосов
/ 26 сентября 2013

Вот как я решил эту проблему:

def gettail(path_, length):        
    elements = []
    for i in range(length):
        s = os.path.split(path_)
        elements.append(s[1])
        path_ = s[0] 

    outpath = elements.pop()
    while elements:
        outpath = os.path.join(outpath, elements.pop())
    return outpath

Вывод:

>>> print gettail(r"C:\foo\bar\baz\text.txt", 3)
    'bar\\baz\\text.txt'

Предложения / улучшения приветствуются.

0 голосов
/ 22 августа 2011

Я бы сказал проще. Конвертируйте и cwd, и ваш входной путь в абсолютные пути, а затем просто используйте startwith и нарезку

path = os.path.abspath(path)
#Make sure you finish curDir with a path separator
#to avoid incorrect partial matches
curDir = os.path.abspath(".") + os.path.sep
if path.startswith(curDir):
    whatYouWant = path[len(curDir) - 1:]
0 голосов
/ 22 августа 2011
In [44]: path = 'a/b/c'

In [45]: back = os.path.relpath('.', os.path.join(path, '..'))

In [46]: back
Out[46]: '..\\..'

In [47]: tail = os.path.relpath(path, os.path.join(path, back)))

In [48]: tail
Out[48]: 'b\\c'

Ака, нет, не то, что я знаю.

...