単一パスから上位パスを取得するにはどうすればよいですか?単一パスから上位パスを取得するにはどうすればよいですか?
ですから、のようなパスを持っていると言う:
'C:\a\b\c\d\'
私は'C:\a\b'
または'C:\a\b\c'
に取得するにはどうすればよいこれを行うにはニシキヘビの方法はありますか?
単一パスから上位パスを取得するにはどうすればよいですか?単一パスから上位パスを取得するにはどうすればよいですか?
ですから、のようなパスを持っていると言う:
'C:\a\b\c\d\'
私は'C:\a\b'
または'C:\a\b\c'
に取得するにはどうすればよいこれを行うにはニシキヘビの方法はありますか?
from os import path
path.dirname("C:\\a\\b\\c\\d\\")
が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")
os.path.split("C:\\a\\b\\c")
はタプルを返します。
('C:\a\b', 'c')
あなたはすることができますタプルの最初の要素に対してsplitを呼び出し続けます。これは、適切な/ニシキヘビのソリューションである場合
標準ライブラリの機能を複製しています。これはより堅牢です(パスが '\'で始まり、あなたの例で終わる場合)、移植性が向上します(あなたの例はlinuxでは動作しません) –
>>> 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
あまり有益な情報ではありませんが、私は遊んでいましたが、とにかくここに投稿する必要があると考えました。
いいえ、「os import pathから」を実行した場合は、path.dirnameとして参照してください。 – rmmh
+1:ドキュメントへのリンク。 –