2013-08-08 6 views
7

मैक आमतौर पर एचएफएस + फाइल सिस्टम पर काम करते हैं जो पथ को सामान्य करता है। यही है, अगर आप इसमें फ़ाइल के साथ फ़ाइल को सहेजते हैं (u'\xe9') उदाहरण के लिए, और फिर os.listdir करें तो आप देखेंगे कि फ़ाइल नाम u'e\u0301' में परिवर्तित हो गया है। यह सामान्य यूनिकोड एनएफडी सामान्यीकरण है कि the Python unicodedata module संभाल सकता है। दुर्भाग्य से एचएफएस + एनएफडी के साथ पूरी तरह से संगत नहीं है, जिसका अर्थ है कि कुछ पथ सामान्य नहीं होंगे, उदाहरण के लिए 福 (u'\ufa1b') नहीं बदला जाएगा, हालांकि इसका एनएफडी फॉर्म u'\u798f' है।मैक ओएस एक्स पथ, लगभग-एनएफडी सामान्य रूप में पथ को कैसे परिवर्तित करें?

तो, पायथन में सामान्यीकरण कैसे करें? जब तक मैं उन्हें पायथन से कॉल कर सकता हूं तब तक मैं देशी एपीआई का उपयोग कर ठीक हूं।

+0

एक बेवकूफ हैक जो काम करना चाहिए: एक अस्थायी फ़ाइल में एक खाली फ़ाइल बनाएं और इसे सूचीबद्ध करें। – Dougal

+0

ध्यान दें कि temp फ़ाइल हैक बहुत महंगा हो जाता है जब आप मानते हैं कि आपको एक पथ पारित किया जा सकता है जो एक गहरी निर्देशिका संरचना का प्रतिनिधित्व करता है। आपको os.makedirs करने और फ़ाइल को स्पर्श करने की आवश्यकता होगी और फिर निर्देशिका संरचना को चलने के लिए देखें कि क्या बनाया गया है। –

+0

संभवतः सामान्यीकरण निर्देशिका और फ़ाइल नामों के बीच संगत है, इसलिए आप भागों को विभाजित कर सकते हैं और केवल उन फ़ाइलों के लिए फाइलें बना सकते हैं जिनमें चलने वाली निर्देशिकाओं से बचने के लिए संभावित रूप से बदलते वर्ण हैं। लेकिन हाँ, यह स्पष्ट रूप से एक बहुत अच्छा समाधान नहीं है। – Dougal

उत्तर

5

ठीक है, पाइथन समाधान लिखने का फैसला किया, क्योंकि संबंधित अन्य प्रश्न जो मैंने इंगित किया था वह अधिक उद्देश्य-सी था।

सबसे पहले आपको https://pypi.python.org/pypi/pyobjc-core और https://pypi.python.org/pypi/pyobjc-framework-Cocoa इंस्टॉल करने की आवश्यकता है। तो फिर काम करना चाहिए निम्नलिखित:

import sys 

from Foundation import NSString, NSAutoreleasePool 

def fs_normalize(path): 
    _pool = NSAutoreleasePool.alloc().init() 
    normalized_path = NSString.fileSystemRepresentation(path) 
    upath = unicode(normalized_path, sys.getfilesystemencoding() or 'utf8') 
    return upath 

if __name__ == '__main__': 
    e = u'\xe9' 
    j = u'\ufa1b' 
    e_expected = u'e\u0301' 

    assert fs_normalize(e) == e_expected 
    assert fs_normalize(j) == j 

नोट NSString.fileSystemRepresentation() भी str इनपुट स्वीकार करने के लिए लगता है कि। मेरे पास कुछ मामले थे जहां वह उस मामले में कचरा लौट रहा था, इसलिए मुझे लगता है कि यूनिकोड के साथ इसका उपयोग करना सुरक्षित होगा। यह हमेशा स्ट्र प्रकार देता है, इसलिए आपको वापस यूनिकोड में कनवर्ट करने की आवश्यकता है।

संबंधित मुद्दे