2009-07-11 11 views
11
>>> os.path.basename('http://example.com/file.txt') 
'file.txt' 

..と私はos.path.*はローカルパスではなくURLでのみ動作すると思いましたか?上記の例は、Windowsでも同様に実行されていることに注意してください。 Windows上でos.path.basenameはURLで動作しますが、なぜですか?

+0

明確化:私は/ why/itがうまく動作しない(ソースコードが明らかに移動する方法について)質問していません。なぜなら私はなぜそれが全く機能しないのか(特にWindowsの\はパスセパレータである) –

+1

Microsoft OSは 'Dos 2'からのパス区切り文字として'/'スラッシュを受け入れますが、' Dos 3'からは'/'はコマンドシェルによって無効にされました(それはもはやありません)。コマンドラインオプションフラグ表記と衝突していたからです。そのため、多くの実装では単に '/'の妥当性を認識していません。 Pythonは明らかにそうです。また、 '\\?\"接頭辞でスラッシュを使用することはできません。ソースhttp://bytes.com/topic/python/answers/23123-when-did-windows-start-accepting-forward-slash-path-separatorおよびhttp://msdn.microsoft.com/en-us/library /aa365247(VS.85).aspx#paths – n611x007

答えて

17

は(ちょうどはパス操作のために特に便利であることをが起こる)だけで文字列操作関数です - そしてそれは無害とたまに便利ですので、正式には「間違った」話している間、私はこの意志を疑いますいつでもすぐに変更 - 詳細については、シェル/コマンドプロンプトで次のような単純なワンライナーを使用します。

$ python -c"import sys; import StringIO; x = StringIO.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print x.getvalue().splitlines()[10][9:]" 

それとも、Pythonの3のために:

$ python -c"import sys; import io; x = io.StringIO(); sys.stdout = x; import this; sys.stdout = sys.__stdout__; print(x.getvalue().splitlines()[10][9:])" 
+4

私は1ライナーが非常に印象的だと言わなければならない。 – sunqiang

+0

on windows:s/'/ "/ g – ars

+0

@ars、tx、"実際にはクロスプラットフォームなので、編集しています。 @sunqiang、あなたがそれを好きでうれしい! - ) –

3

、ソースコードを見て:C:

def basename(p): 
    """Returns the final component of a pathname""" 
    return split(p)[1] 
ntpath.py \ Python25 \ Libの\

(同じファイル内)os.path.splitは単に "\"(とSTHを分割します。他)

+0

は、URLに 'os.path.basename'を使用しています。これらの情報を抽出するための無限の方法ですか?代わりに 'urlpare.urparse( '').path'を使うべきですか? – n611x007

+1

@naxa遅れの応答を申し訳ありません、私はそれがpythonicだとは思わない、それはパス/ filepath.Base "サポート"のURLを行くのパスを見てだと思った。私は親切にurlparseをURLのハンドルの方が好む。 – sunqiang

2

ソースルークを使用します。


def basename(p): 
    """Returns the final component of a pathname""" 
    i = p.rfind('/') + 1 
    return p[i:] 

編集(明確化への応答):

これは偶然にURLのために働く、それだけです。そのため、その振る舞いを悪用することは、コードの臭いとみなされる可能性があります。それは(渡されたパスがURLでない場合に確認してください)「修正」しようとすると

も驚くほど困難である

www.google.com/test.php 
[email protected]/12 
./src/bin/doc/goto.c 

のでhttp:/hello.txt(一つであり、同時に、正しいパス名とURL(相対)です/ 、そしてLinux上でのみ、それはちょっと愚かです:))。あなたは絶対URLのためにそれを "修正"することができますが、相対URLは引き続き動作します。異なった点で特別なケースを扱うことは、Pythonの世界では大きな問題ではありません。

それをまとめると:インポートこの

0

なぜ?これは、URLとローカルファイルパスの解析に便利です。何故なの? os.pathの実際多くの機能で

+0

これはos.pathモ​​ジュールにあり、Windowsを実行している場合はOSが理解できるパスではないためです。パスセパレータは異なります。私は/が有効なファイル名であり、この動作が間違っていると考えています。私はWindowsユーザーではないので、このコメントの一部または全部は不気味かもしれません。 – SpoonMeiser

+1

@SpoonMeiser、マイクロソフトのCライブラリの実装は、実際には/を有効な代替手段として使用できるようにします(OS自体、syscall/Win32APIレベルでポイントまでは行いましたが、数年前から;-)。 –

+0

@Alex Martelli、まだそれが当てはまるなら、それは理にかなっています。 – SpoonMeiser

1

FORW ardスラッシュは、Windowsでも許容されるパス区切り文字です。

argsスイッチ用に予約されているため、コマンドラインでは/で始まるパスは受け入れられません。

関連する問題