Как получить верхние пути из одного пути? - PullRequest
1 голос
/ 27 марта 2009

Как получить верхние пути из одного пути?

Скажем, у вас есть путь вроде:

'C:\a\b\c\d\'

Как мне добраться до 'C:\a\b' или 'C:\a\b\c'

Есть ли питонский способ сделать это?

Ответы [ 4 ]

10 голосов
/ 27 марта 2009

См. os.path

from os import path
path.dirname("C:\\a\\b\\c\\d\\")
4 голосов
/ 27 марта 2009

Theres основные вещи, такие как os.path методы.

Если вы хотите получить список полных путей к каждому последующему родительскому элементу в дереве каталогов, вот одна строка:

from os.path import dirname

def f1(n): return [n] if n == dirname(n) else [n] + f1(dirname(n))

print f1("/a/b/c/d/e/f/g")
2 голосов
/ 27 марта 2009
>>> def go_up(path, n):
...     return os.path.abspath(os.path.join(*([path] + ['..']*n)))
>>> path = 'C:\\a\\b\\c\\d\\'
>>> go_up(path, 2)
'C:\\a\\b'
>>> go_up(path, 1)
'C:\\a\\b\\c'
>>> go_up(path, 0)
'C:\\a\\b\\c\\d'

Не будучи постоянным пользователем os.path , я не знаю, является ли это подходящим / питоническим решением. Я сравнил его с альтернативной функцией, определив следующим образом:

def go_up_2(path, n):
    for i in xrange(n):
        path = os.path.split(path)[0]
    return path

Первое, что нужно отметить, это go_up_2('C:\\a\\b\\', 1) != go_up_2('c:\\a\\b', 1), где это происходит с оригинальным go_up. Тем не менее, производительность значительно выше, если это проблема (вероятно, нет, но я искал какой-то определенный способ сказать, что мой собственный алгоритм был лучше):

import timeit

g1 = """import os.path
import ntpath
os.path = ntpath
def go_up(path, n):
    return os.path.abspath(os.path.join(*([path] + ['..']*n)))"""

g2 = """import os.path
import ntpath
os.path = ntpath
def go_up(path, n):
    for i in xrange(n-1):
        path = os.path.split(path)[0]
    return path"""

t1 = timeit.Timer("go_up('C:\\a\\b\\c\\d', 3)", setup=g1).timeit()
t2 = timeit.Timer("go_up('C:\\a\\b\\c\\d', 3)", setup=g2).timeit()

print t1
print t2

Это выводит (на моей машине):

133.364659071
30.101334095

Не очень полезная информация, но я поигрался и решил, что ее все равно следует публиковать здесь.

2 голосов
/ 27 марта 2009

os.path.split("C:\\a\\b\\c") вернет кортеж:

('C:\a\b', 'c')

Вы можете продолжать вызывать split для первого элемента кортежа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...