4

これを行う効果的な方法が見つかりません。私がやろうとしていることを説明する最良の方法は例です。したがって、どこに行くか (/bar/ が親であると仮定):

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

私のパスになります。パスの最上位の親ディレクトリまでのすべてに興味があります。私が必要としているのは、まさにそれを行うスクリプトです。つまり、

\bar\baz\text.txt

スプリットは私にはうまくいきません。ファイルとパスを分割しますが、このような出力は得られません。不足している組み込み関数はありますか、それとも SOL ですか? ありがとう!

4

7 に答える 7

1

何が必要かはわかりませんが、文字列の右側から分割するあまり知られていない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'
于 2011-08-22T02:28:34.540 に答える
1

いつでも使用できますstring.split()

>>> print '\\' + path.split('\\', 2)[-1]
\bar\baz\text.txt
于 2011-08-21T23:44:19.027 に答える
1

「最上位の親ディレクトリ」と言う意味がよくわかりません。最上位ディレクトリはC:\. 何の親?現在の作業ディレクトリの親で始まる相対パスを取得しようとしている場合は、これを試してください。

import os.path
os.path.relpath("C:\\foo\\bar\\baz\\text.txt", os.path.dirname(os.path.realpath('..')))
于 2011-08-22T01:17:49.483 に答える
0

この問題を解決した方法は次のとおりです。

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'

提案/改善を歓迎します。

于 2013-09-26T19:22:44.437 に答える
0
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'

いいえ、私が知っていることではありません。

于 2011-08-21T23:06:54.507 に答える
0

私はそれをシンプルに保ちます。cwd と入力パスの両方を絶対パスに変換してから、startswith と slicing を使用します。

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:]
于 2011-08-21T23:21:04.390 に答える