2009-12-04 16 views
5

पर os.path.normcase के विपरीत, सभी निचले केस पथ से "वास्तविक" केस संवेदनशील पथ प्राप्त करने का कोई आसान तरीका है। os.path.normcase के विपरीत की तरह। मैं निम्नलिखित स्निपेट, कैसे d_real प्राप्त करने के लिए किया है, तोविंडोज

c:\StackOverFlow 

:

उदाहरण के लिए, निर्देशिका पर विचार?

>>> import os 
>>> d = os.path.normcase('C:\\StackOverFlow') # convert to lower case 
>>> d 
'c:\\stackoverflow' 
>>> d_real = ... # should give 'C:\StackOverFlow' with the correct case 
+0

'os.path.join ('c:', 'stackoverflow')' आप देता है 'ग: stackoverflow', * नहीं *' c: \ stackoverflow', (डॉक्स में समझाया = पथ रिश्तेदार निर्दिष्ट ड्राइव पर वर्तमान निर्देशिका के लिए)। –

+0

हाँ, मैंने अपना उदाहरण कोड नहीं देखा। इसे ठीक कर देगा। धन्यवाद। – pkit

उत्तर

0

गंदा हैक दृष्टिकोण,

import glob 
... 
if os.path.exists(d): 
    d_real = glob.glob(d + '*')[0][:len(d)] 
+0

glob.glob (डी + '*') विंडोज पर एक खाली सूची देता है (कम से कम मेरे लिए) – jhwist

+0

@jhwist, मैंने इसे विंडोज़ पर परीक्षण किया और यह काम करता है। आपने 'डी' के लिए क्या उपयोग किया? –

+0

हम्म, साइगविन-शैली पथों का कुछ मिश्रण हो सकता है, मेरा 'डी =" सी:/मौजूदा_फाइल "' – jhwist

1

मैं इस समाधान सरल पर विचार नहीं होगा, लेकिन आप क्या कर सकते हैं है:

import os 
d = os.path.normcase('C:\\StackOverFlow') 
files = os.listdir(os.path.dirname(d)) 
for f in files: 
    if not d.endswith(f.lower()): 
    continue 
    else 
    real_d = os.path.join(os.path.dirname(d), f) 

यह शायद कुशल नहीं है (पर निर्भर करता है निर्देशिका में फाइलों की संख्या)। इसे पथ-घटकों के लिए tweaking की आवश्यकता है (मेरा समाधान वास्तव में केवल फ़ाइल नाम के मामले में सुधार करता है और निर्देशिका नामों की परवाह नहीं करता है)। इसके अलावा, पेड़ को पार करने के लिए शायद os.walk सहायक हो सकता है।

-1

निश्चित रूप से बदसूरत, लेकिन मज़ा:

def getRealDirPath(path): 
    try: 
     open(path) 
    except IOError, e: 
     return str(e).split("'")[-2] 
बेशक

:

  • केवल dirs साथ काम करता है
  • गाड़ी हो सकता है अगर dir एक और कारण

के लिए खुला नहीं किया जा सकता लेकिन अगर आपको "जीवन या मृत्यु" कोड के लिए इसकी आवश्यकता नहीं है तो भी उपयोगी हो सकता है।

मानक lib को grep करने का प्रयास किया ताकि यह पता चल सके कि उन्हें असली पथ कैसे मिला लेकिन उसे नहीं मिला। सी

था उस दिन के गंदे हैक में होना चाहिए, अगली बार जब हम स्टैकट्रेस पर एक regexp का उपयोग सिर्फ इसलिए कि हम :-)

+0

काम नहीं करता है ... – schlamar

0

आप GetShortPathName और GetLongPathName चेनिंग करके ऐसा कर सकते कर सकते हैं। यह सिद्धांत में काम नहीं कर सकता क्योंकि आप कुछ विन्यास सेटिंग के साथ विंडोज पर छोटे फ़ाइल नाम अक्षम कर सकते हैं। यहां कुछ नमूना कोड ctypes का उपयोग कर रहा है:

def normcase(path): 
    import ctypes 
    GetShortPathName = ctypes.windll.kernel32.GetShortPathNameA 
    GetLongPathName = ctypes.windll.kernel32.GetLongPathNameA 
    # First convert path to a short path 
    short_length = GetShortPathName(path, None, 0) 
    if short_length == 0: 
     return path 
    short_buf = ctypes.create_string_buffer(short_length) 
    GetShortPathName(path, short_buf, short_length) 
    # Next convert the short path back to a long path 
    long_length = GetLongPathName(short_buf, None, 0) 
    long_buf = ctypes.create_string_buffer(long_length) 
    GetLongPathName(short_buf, long_buf, long_length) 
    return long_buf.value 
+0

यह बहुत अच्छा काम करता है कि पथ के ड्राइव या नेटवर्क घटक अभी भी एक मनमाना मामला हो सकता है। मुझे 'parts = os.path.splitdrive (os.path.normcase (पथ))' 'पथ = भागों [0]। अपपर() + भागों [1] ' की शुरुआत में इसे जोड़ने में उपयोगी पाया गया फ़ंक्शन ताकि मेरे पास अपरकेस ड्राइव अक्षर और लोअरकेस नेटवर्क पथ हों। – garlon4

+0

नोट: इस फ़ाइल सिस्टम आश्रित समाधान के लिए पहले जांचें कि ** लघु फ़ाइल नाम पीढ़ी ** विंडोज वॉल्यूम्स ('fsutil.exe 8dot3name क्वेरी सी:') पर बंद हो गया है - इस बीच प्रदर्शन के लिए अनुशंसा की जाती है जब तक कि 16 बिट ऐप्स अभी भी त्यौहार न हों। – kxr

1

केवल मानक 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 
+0

@Alecz, फ़ाइलें मुख्य उपयोग केस हैं। समस्या का पुनरुत्पादन नहीं कर सकता। उदाहरण? ज्ञात: यह एक संभावित ड्राइव अक्षर (और यूएनसी सेवा नाम) को अपरकेस नहीं करता है; स्लैश कन्वर्ट नहीं करता है -> बैकस्लैश। यह फाइलों/डीआईआरएस पर कुछ भी नहीं करता है जो वास्तव में अस्तित्व में नहीं है (केवल आंशिक पथ का अस्तित्व)। या हो सकता है कि आपने झूठी/गायब बैकस्लैश से बचने या गायब कच्चे स्ट्रिंग उपसर्ग आर के साथ एक परीक्षण पथ का प्रयोग किया - उदा। '" कुछ \\ false \ rawpath.txt "'। – kxr

+0

अब मैं इसे पुन: उत्पन्न नहीं कर सकता। यह पूरी तरह से काम करता है, मुझे लगता है कि यह एक बहुत साफ समाधान है। मैं अपनी दूसरी टिप्पणी हटा दूंगा। धन्यवाद! – Alecz