13

私は Python を学んでいますが、スクリプトの 1 つに奇妙な点があることに気付きました。少しテストを行ったところ、この問題が次の動作に起因することがわかりました。

>>> import os
>>> os.path.join('a','b')
'a/b'
>>> os.path.join('a','/b')
'/b'

ドキュメントを確認すると、これは実際には関数の設計です。

os.path. 結合(パス 1 [ ,パス2 [ , ... ]] )

1 つ以上のパス コンポーネントをインテリジェントに結合します。いずれかのコンポーネントが絶対パスである場合、以前のすべてのコンポーネント (Windows では、以前のドライブ文字があった場合はそれを含む) が破棄され、結合が続行されます。...

私の質問は、スクリプトが失敗した理由ではなく、関数がこのように設計された理由です。つまり、少なくともUnixでは、a//bエレガントではないにしても、パスを指定するのに完全に受け入れられる方法です。関数がこのように設計されたのはなぜですか? で各パス文字列をテストする以外に、1 つ以上のパス要素が破棄されたかどうかを確認する方法はありますos.path.isabs()か?


好奇心から、パス コンポーネントがos.sep文字で終わるケースも確認しました。

>>> os.path.join('a/','b')
'a/b'

それは期待どおりに機能します。

4

2 に答える 2

15

os.path.join('a', '/b')が返されると便利なケースの 1 つは/b、ユーザーにファイル名を尋ねる場合です。

ユーザーは、現在のディレクトリからの相対パスまたはフル パスのいずれかを入力できます。プログラムは、次のように両方のケースを処理できます。

os.path.join(os.getcwd(), filename)

In [54]: os.getcwd()
Out[54]: '/tmp'

In [55]: os.path.join(os.getcwd(), 'foo')
Out[55]: '/tmp/foo'

In [56]: os.path.join(os.getcwd(), '/foo/bar')
Out[56]: '/foo/bar'
于 2012-09-26T19:38:44.233 に答える
1

cd新しいディレクトリをチェックするようなユーティリティを書いていると思います。

os.path.join(currdir, newdir)

ユーザーが入力した場合/b、最初の引数をスローする以外はあなたになります。これは、現在のディレクトリを使用する多くのことを保持します。

于 2012-09-26T19:41:26.103 に答える