2009-03-26 18 views

答えて

10

os.path

from os import path 
path.dirname("C:\\a\\b\\c\\d\\") 
+0

いいえ、「os import pathから」を実行した場合は、path.dirnameとして参照してください。 – rmmh

+0

+1:ドキュメントへのリンク。 –

4

os.path方法などの基本的なものをTheresの参照してください。

ディレクトリツリー内の各連続した親のフルパス名のリストをしたい場合は、相続人1つのライナー:

from os.path import dirname 

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

print f1("https://stackoverflow.com/a/b/c/d/e/f/g") 
2

os.path.split("C:\\a\\b\\c")はタプルを返します。

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

あなたはすることができますタプルの最初の要素に対してsplitを呼び出し続けます。これは、適切な/ニシキヘビのソリューションである場合

+0

標準ライブラリの機能を複製しています。これはより堅牢です(パスが '\'で始まり、あなたの例で終わる場合)、移植性が向上します(あなたの例はlinuxでは動作しません) –

2
>>> 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でないことgo_up_2('C:\\a\\b\\', 1) != go_up_2('c:\\a\\b', 1)、です。しかし、それが問題であるならば、性能は、有意に良好である(おそらくないが、私は私自身のアルゴリズムを言うためにいくつかの決定的な方法を探していたことは良かった):

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 

あまり有益な情報ではありませんが、私は遊んでいましたが、とにかくここに投稿する必要があると考えました。

関連する問題