>>> os.path.basename('http://example.com/file.txt')
'file.txt'
..と私はos.path.*
はローカルパスではなくURLでのみ動作すると思いましたか?上記の例は、Windowsでも同様に実行されていることに注意してください。 Windows上でos.path.basenameはURLで動作しますが、なぜですか?
>>> os.path.basename('http://example.com/file.txt')
'file.txt'
..と私はos.path.*
はローカルパスではなくURLでのみ動作すると思いましたか?上記の例は、Windowsでも同様に実行されていることに注意してください。 Windows上でos.path.basenameはURLで動作しますが、なぜですか?
は(ちょうどはパス操作のために特に便利であることをが起こる)だけで文字列操作関数です - そしてそれは無害とたまに便利ですので、正式には「間違った」話している間、私はこの意志を疑いますいつでもすぐに変更 - 詳細については、シェル/コマンドプロンプトで次のような単純なワンライナーを使用します。
$ 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:])"
、ソースコードを見て:C:
def basename(p):
"""Returns the final component of a pathname"""
return split(p)[1]
ntpath.py \ Python25 \ Libの\
(同じファイル内)os.path.splitは単に "\"(とSTHを分割します。他)
ソースルークを使用します。
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の世界では大きな問題ではありません。
それをまとめると:インポートこの
なぜ?これは、URLとローカルファイルパスの解析に便利です。何故なの? os.path
の実際多くの機能で
これはos.pathモジュールにあり、Windowsを実行している場合はOSが理解できるパスではないためです。パスセパレータは異なります。私は/が有効なファイル名であり、この動作が間違っていると考えています。私はWindowsユーザーではないので、このコメントの一部または全部は不気味かもしれません。 – SpoonMeiser
@SpoonMeiser、マイクロソフトのCライブラリの実装は、実際には/を有効な代替手段として使用できるようにします(OS自体、syscall/Win32APIレベルでポイントまでは行いましたが、数年前から;-)。 –
@Alex Martelli、まだそれが当てはまるなら、それは理にかなっています。 – SpoonMeiser
FORW ardスラッシュは、Windowsでも許容されるパス区切り文字です。
argsスイッチ用に予約されているため、コマンドラインでは/で始まるパスは受け入れられません。
明確化:私は/ why/itがうまく動作しない(ソースコードが明らかに移動する方法について)質問していません。なぜなら私はなぜそれが全く機能しないのか(特にWindowsの\はパスセパレータである) –
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