2010-01-21 11 views
13

हालांकि विंडोज केस असंवेदनशील है, यह फ़ाइल नामों में मामला सुरक्षित रखता है। पायथन में, फ़ाइल सिस्टम पर फ़ाइल के रूप में संग्रहीत करने के साथ कोई फ़ाइल नाम प्राप्त करने का कोई तरीका है?पायथन: विंडोज़ में संग्रहीत फ़ाइल नाम केस प्राप्त करना?

उदा।, एक पायथन प्रोग्राम में मेरे पास फ़ाइल नाम = "texas.txt" है, लेकिन यह जानना है कि यह वास्तव में फ़ाइल सिस्टम पर "TEXAS.txt" संग्रहीत है, भले ही यह विभिन्न फ़ाइल संचालन के लिए अपरिहार्य है।

+0

(आकस्मिक डुप्लिकेट खातों का विलय कर दिया) –

उत्तर

8

recurse करना चाहते हैं यहाँ यह करने के लिए सबसे आसान तरीका है:

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

यह मेरे लिए काम नहीं करता - मुझे अभी भी 'texas.txt' मिलता है। – diggums

+1

क्या है win32api.GetLongPathName (win32api.GetShortPathName ('texas.txt')) 'काम? –

+2

हाँ, यह काम करता है। असल में, स्पष्टीकरण के लिए, आपका मूल सुझाव काम करता है, लेकिन यदि कोई निर्देशिका शामिल नहीं है - उदाहरण के लिए, 'win32api.GetLongPathName (' \\ states \\ texas.txt ')' उपज '' \\ राज्य \\ TEXAS.txt'' , जबकि 'win32api.GetLongPathName (win32api.GetShortPathName (' \\ states \\ texas.txt '))' सही ढंग से '' \\ स्थिति \\ TEXAS.txt'' उत्पन्न करता है।उसने मुझे भ्रमित कर दिया था, अब मैं पूरी तरह से तैयार हूं। धन्यवाद! – diggums

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

क्या यह आपके प्रश्न का उत्तर देता है?

1

आप इस्तेमाल कर सकते हैं:

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') 

बेशक यह मानता है कि अपने खोज स्ट्रिंग 'texas.txt' छोटे अक्षरों में है। यदि ऐसा नहीं है तो आपको इसे पहले लोअरकेस में परिवर्तित करना होगा।

+2

'प्रिंट ([f.lower() ==" texas.txt "] + [" फ़ाइल नहीं मिली "] + [ –

+0

@Roger: हाहा , उत्तम सामग्री! मैं अभी भी सूची समझ की शक्ति के साथ पकड़ने के लिए मिल रहा है। मैं जवाब के लिए एक-लाइनर पोस्ट नहीं करता हूं, क्योंकि वे अक्सर रोशनी से अधिक भ्रमित हो सकते हैं :)। –

+0

बस एक नोट: string.lower() का उपयोग करने की कोई आवश्यकता नहीं है। – ghostdog74

1

और यदि आप निर्देशिका

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

मैं ऊपर win32api समाधान के साथ विशेष वर्ण के साथ समस्या थी।

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

अच्छा बिंदु (पायथन 2.x पर लागू होता है - 3.x पर आवश्यक नहीं है, जो मूल रूप से यूनिकोड है)। बस स्पष्ट होने के लिए: इनपुट पथ (भी) एक यूनिकोड स्ट्रिंग होना चाहिए (उदा।, 'U'texas.txt'')। – mklement0

+0

http://stackoverflow.com/a/2114975/179715 पर मेरी टिप्पणी देखें; यदि लघु फ़ाइल नाम पीढ़ी अक्षम है तो यह काम करने की गारंटी नहीं है। – jamesdlin

0

यह एक ही मानक lib है और (ड्राइव अक्षर को छोड़कर) सभी पथ भागों धर्मान्तरित: यूनिकोड फ़ाइल नामों के लिए आप उपयोग करने की आवश्यकता

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

और यह एक अलावा UNC पथ संभालता है:

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 

ध्यान दें: यह फाइल सिस्टम निर्भर विन एपीआई "GetShortPathName" चाल की तुलना में कुछ धीमी है, लेकिन मंचकाम करता हैफाइल सिस्टम स्वतंत्र है और यह भी जब छोटा फ़ाइल नाम पीढ़ी विंडोज वॉल्यूम पर बंद है (fsutil.exe 8dot3name query C:) - जो recommended कम से कम प्रदर्शन महत्वपूर्ण फाइल सिस्टम के लिए है, जब कोई 16bit क्षुधा उस पर अब और भरोसा:

fsutil.exe behavior set disable8dot3 1 
संबंधित मुद्दे