>>> 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
Не очень полезная информация, но я поигрался и решил, что ее все равно следует публиковать здесь.