0

注:私のためにコーディングしないでください。 私はすでに、以下で説明することを実行するためのホームロール関数を持っています。

標準のPythonライブラリに、引数として絶対パスを取り、冗長なもの(たとえば./)をすべて削除した後、などのビットを解決した後、すべての「アトミック」パスコンポーネントのタプルを返す関数はあり../ますか?たとえば、Unixパスが与えられた場合/s//pam/../ham/./eggs、出力は次のようになります。

('/', 's', 'ham', 'eggs')

Windowsパスを指定するとC:\s\\pam\..\ham\.\eggs、出力は次のようになります。

('C:', '\\', 's', 'ham', 'eggs')

ありがとう!

4

2 に答える 2

2

標準ライブラリで(AFAIR)を取得するのと同じくらい近く:

   >>> import os
   >>> help(os.path.split)
    Help on function split in odule ntpath:

    split(p)
        Split a pathname.
        Return tuple (head, tail) where tail is everything after the final slash.
        Either part may be empty.

これはユースケースを解決しませんが、拡張するのは簡単です。詳細については、コメントを参照してください。

于 2012-05-10T00:22:05.640 に答える
0

必要なことを実行する単一の関数はありません...主に、パス操作の観点からは、要求していることが意味をなさないためです(破棄する..とパスが意味のある方法で変更されるため)。

あなたは次の線に沿って何かをすることができます:

[x for x in path.split(os.path.sep) if x not in ['.', '..']]

それはあなたに与えます:

>>> path='/s//pam/../ham/./eggs'
>>> [x for x in path.split(os.path.sep) if x not in ['.', '..']]
['', 's', '', 'pam', 'ham', 'eggs']

と:

>>> path=r'C:\s\\pam\..\ham\.\eggs'
>>> [x for x in path.split(os.path.sep) if x not in ['.', '..']]
['C:', 's', '', 'pam', 'ham', 'eggs']

os.path.sep(である限り\)。

それは明らかにあなたが探しているものではありませんが、おそらくそれは正しい方向への道を示しています。

于 2012-05-10T00:27:18.520 に答える