2010-01-21 13 views
13

Windows büyük/küçük harfe duyarsız olsa da, dosya isimlerindeki durumu korur. Python'da, dosya sisteminde saklandığı haliyle bir dosya adı almak için herhangi bir yol var mı?Python: Windows'da depolandığı gibi dosya adı alıyor musunuz?

Örn., Bir Python programında, filename = "texas.txt" var, ancak dosya sisteminde, bu dosya için farklı olsa bile, aslında "TEXAS.txt" dosyasını sakladığını bilmek isteriz.

+0

(yanlışlıkla yinelenen hesaplar birleşti) –

cevap

8

Recurse istiyorsanız İşte bunu yapmak için en basit yolu şudur:

>>> import win32api 
>>> win32api.GetLongPathName(win32api.GetShortPathName('texas.txt'))) 
'TEXAS.txt' 
+0

Bu benim için çalışmadı - hala 'texas.txt' alıyorum. – diggums

+1

Win32api.GetLongPathName (win32api.GetShortPathName ('texas.txt')) Çalışıyor mu? –

+2

Evet, işe yarıyor. Aslında, açıklığa kavuşturmak için, orijinal öneriniz çalışır, ancak bir dizin dahil değilse - örneğin, win32api.GetLongPathName ('\\ state \\ texas.txt') ''\\ state \\ TEXAS.txt' , win32api.GetLongPathName (win32api.GetShortPathName ('\\ state \\ texas.txt')) '' doğru şekilde '' \\ STATES \\ TEXAS.txt '' verir.Kafam karıştı, şimdi ben ayarlandım. Teşekkürler! – diggums

1
>>> import os 
>>> os.listdir("./") 
['FiLeNaMe.txt'] 

Bu soruya cevap veriyor mu?

1

Sen kullanabilirsiniz:

import os 
a = os.listdir('mydirpath') 
b = [f.lower() for f in a] 
try: 
    i = b.index('texas.txt') 
    print a[i] 
except ValueError: 
    print('File not found in this directory') 

Bu tabii arama dizesi 'texas.txt' küçük harflerle olduğunu varsayar. Eğer değilse, önce küçük harfle dönüştürmeniz gerekecek.

+2

'print (f.lower() ==" texas.txt "] + [" dosya bulunamadı "]) [0] –

+0

@Roger: Haha , harika şeyler! Hala liste kavramanın gücü ile uğraşıyorum. Yine de, cevaplar için tek-katmanları yayınlamama eğilimindeyim, çünkü genellikle aydınlatıcıdan daha kafa karıştırıcı olabilirler :). –

+0

Sadece bir not: Artık string.lower() kullanmaya gerek yok. – ghostdog74

1

ve dizinleri

import os 
path=os.path.join("c:\\","path") 
for r,d,f in os.walk(path): 
    for file in f: 
     if file.lower() == "texas.txt": 
       print "Found: ",os.path.join(r , file) 
5

Yukarıda Win32API çözümü ile özel karakterler ile ilgili sorunlar vardı.

win32api.GetLongPathNameW(win32api.GetShortPathName(path)) 
+2

İyi nokta (doğal olarak Unicode olan 3.x'te gerekli değildir) Python 2.x için geçerlidir). Sadece açık olmak gerekirse: giriş yolu (çok) bir Unicode dizgisi olmalıdır (ör., 'U'texas.txt'). – mklement0

+0

http://stackoverflow.com/a/2114975/179715; Kısa dosya adı oluşturma devre dışı bırakılmışsa, bunun çalışması garanti edilmez. – jamesdlin

0

Bu seferki yalnızca standart lib ve (sürücü harfi hariç) tüm yol parçalarını dönüştürür: unicode dosya adları için kullanmak gerek

def casedpath(path): 
    r = glob.glob(re.sub(r'([^:/\\])(?=[/\\]|$)', r'[\1]', path)) 
    return r and r[0] or path 

Ve bu ek olarak UNC yollarını ele alır:

def casedpath_unc(path): 
    unc, p = os.path.splitunc(path) 
    r = glob.glob(unc + re.sub(r'([^:/\\])(?=[/\\]|$)', r'[\1]', p)) 
    return r and r[0] or path 

Not: dosya sistemi bağımlı Win API "GetShortPathName" hile biraz daha yavaş olmakla platformuişleri kısa dosya adı nesil Windows birimlerinde kapalıyken de bağımsız vedosya sistemi (fsutil.exe 8dot3name query C:) - hayır 16bit uygulamalar bu konuda artık itimat zaman recommended en azından performans kritik dosya sistemleri içindir:

fsutil.exe behavior set disable8dot3 1 
İlgili konular