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

.. ve ben os.path.* sadece yerel yollarda ve URL'lerde çalışmayı düşündüm. Yukarıdaki örnekteki Windows'da da aynı sonucu verdiğini unutmayın.os.path.basename, URL'lerle çalışır, neden?

pencerelerin üzerinde
+0

Açıklama: Neden/neden/nasıl çalıştığını sormuyorum (kaynak kodun açık bir şekilde gideceği yol); bunun yerine neden çalışmalıyım diye soruyorum (özellikle de politika - özellikle Windows '\' yol ayırıcıdır) –

+1

Microsoft OS'leri, 'Dos 3''ten bir yol ayırıcı olarak'/'iletisini kabul eder. Komut satırı seçeneği bayrak gösterimi ile çeliştiği için komut gövdesi tarafından devre dışı bırakıldı (artık değil). Bu yüzden birçok uygulama sadece '/' nin geçerliliğinin farkında değildir. Python görünüşe göre. Ayrıca, eğik çizgileri '\\? \' 'Önekiyle kullanamazsınız. http://bytes.com/topic/python/answers/23123-when-did-windows-start-accepting-forward-slash-path-separator ve http://msdn.microsoft.com/en-us/library kaynakları /aa365247(VS.85).aspx#paths – n611x007

cevap

17

birçok fonksiyonlar sadece dize manipülasyon fonksiyonları (sadece yol manipülasyon için özellikle kullanışlı olmasını gerçekleşmesi olan) - ve resmen "yanlış" konuşurken o, zararsız ve bazen kullanışlı olduğundan, bu iradeyi şüphe Python 3,

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

Veya:

$ 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

Tek liner'in çok etkileyici olduğunu söylemeliyim. Pencerelerde – sunqiang

+0

: s/'/ "/ g – ars

+0

@ars, tx," gerçekten daha iyi VE çapraz platformdur, bu yüzden düzenledim. @sunqiang, sevdim sevindim! -) –

3

, kaynak koduna bakmak: C: \ Python25 \ Lib \ (aynı dosyada)

def basename(p): 
    """Returns the final component of a pathname""" 
    return split(p)[1] 

os.path.split sadece bölünmüş "\" (ve sth ntpath.py. else)

+0

'os.path.basename', URL'lerde bu tür bilgileri onlardan ayıklamak için pythonic yolunu kullanıyor mu?ya da urlpare.urparse ('') .path' kullanmalı mıyım? – n611x007

+1

@naxa gecikme yanıtı için özür dilerim, pythonic olduğunu söyleyemem, o go yolu/filepath.Base "destek" url de bak. Ben url kolu için urlparse tercih ederim. – sunqiang

2

kaynak Luke kullanın:


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

Edit açıklama için (tepki):

URL'ler için kaza ile çalışıyor, işte bu. Bu nedenle, davranışını sömüren, bazıları tarafından kod kokusu olarak kabul edilebilir. o (geçirilen yol url değilse kontrol edin) "düzeltmek" için çalışıyorum

da şaşırtıcı zordur

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

yüzden http:/hello.txt (biridir aynı saatin doğru yol adlarının ve URL'ler (göreceli) altındadır/ve sadece linux üzerinde ve bu biraz aptal :)). Mutlak URL'ler için "düzeltebilirsin", ancak göreceli olanlar hala işe yarayacak. Bir özel durumu farklı olarak ele almak, piton dünyasında büyük bir hayır değildir.

O Özetle: ithalat bu

0

Neden? Çünkü URL'leri ve yerel dosya yollarını ayırmak için kullanışlıdır. Neden olmasın? os.path ait

Uygulamada
+0

Çünkü os.path modülünde ve bu, işletim sistemini çalıştırıyorsanız işletim sistemi tarafından anlaşılmayan bir yol değil; yol ayırıcı farklıdır. Windows'da geçerli bir isim-adı karakteri olduğunu ve bir URL'nin geçerli bir falename yapacağı ve bu davranışın yanlış olduğuna inanıyorum. Ben bir Windows kullanıcısı değilim, bu yüzden bazıları ya da hepsi bu yorum anlamsız olabilir. – SpoonMeiser

+1

@SpoonMeiser, Microsoft'un C kütüphanesinin gerçekte uygulanmasına izin verir/\ (OS'nin kendisi, syscall/Win32API seviyelerinde), geçerli bir alternatif olarak/kullanmanıza izin verir, ancak bir kaç sene öncesine dayanmıyor. ;-). –

+0

@Alex Martelli, Eğer hala doğruysa, o zaman mantıklı olacaktır. – SpoonMeiser

1

forw bir kabuk/komut istemine aşağıdaki basit tek astar kullanmak, daha fazla bilgi için - yakın zamanda değişmeyecek ard eğik çizgi de Windows'da kabul edilebilir bir yol sınırlayıcısıdır.

Sadece komut satırında bir/ile başlayan yolları kabul etmiyor, çünkü bu karakter args anahtarları için ayrılmış.

İlgili konular