मैं वास्तव में अपने पाइथन एप्लिकेशन सौदे को आंतरिक रूप से यूनिकोड तारों के साथ विशेष रूप से रखना चाहता हूं। यह हाल ही में मेरे लिए अच्छा रहा है, लेकिन मैंने पथों को संभालने के साथ एक समस्या में भाग लिया है। फाइल सिस्टम के लिए POSIX API यूनिकोड नहीं है, इसलिए फाइलों के लिए "अनावश्यक" नाम होने के लिए यह संभव है (और वास्तव में कुछ हद तक आम है): फ़ाइल नाम जो फाइल सिस्टम के निर्दिष्ट एन्कोडिंग में एन्कोड नहीं किए गए हैं।पायथन में अनावश्यक फ़ाइल नामों को कैसे संभालें?
पायथन में, यह unicode
और str
के मिश्रण के रूप में प्रकट होता है os.listdir()
से वस्तुओं को वापस किया जा रहा है।
>>> os.listdir(u'/path/to/foo')
[u'bar', 'b\xe1z']
कि उदाहरण में, चरित्र '\xe1'
लैटिन -1 में एन्कोड या somesuch, तब भी जब (काल्पनिक) फाइल सिस्टम की रिपोर्ट sys.getfilesystemencoding() == 'UTF-8'
(UTF-8 में, उस चरित्र '\xc3\xa1'
दो बाइट्स होगा) है। इस कारण से, यदि आप उपयोग करने का प्रयास करते हैं, तो उदाहरण के लिए, os.path.join()
यूनिकोड पथ के साथ, आपको फ़ाइल नाम 0 डीमिल जाएगा, क्योंकि फ़ाइल नाम को डीकोड नहीं किया जा सकता है।
नोट है कि ज्यादातर मौकों में, यूनिकोड एपीआई इस्तेमाल किया जाना चाहिए:
Python Unicode HOWTO यूनिकोड pathnames के बारे में यह सलाह प्रदान करता है। बाइट्स एपीआई केवल उन सिस्टमों पर उपयोग की जानी चाहिए जहां अनावश्यक फ़ाइल नाम मौजूद हो सकते हैं, यानी यूनिक्स सिस्टम।
क्योंकि मैं मुख्य रूप से यूनिक्स सिस्टम की परवाह करता हूं, इसका मतलब यह है कि मुझे केवल अपने कार्यक्रम को पथ के लिए बाइटिंग के साथ सौदा करने के लिए पुनर्गठन करना चाहिए? (यदि हां, तो मैं विंडोज संगतता को कैसे बनाए रख सकता हूं?) या अवांछित फ़ाइल नामों से निपटने के बेहतर तरीके हैं? क्या वे "जंगली में" दुर्लभ हैं कि मुझे सिर्फ उपयोगकर्ताओं को उनकी लानत फाइलों का नाम बदलने के लिए कहा जाना चाहिए?
(यदि यह सबसे अच्छा है बस आंतरिक bytestrings से निपटने के लिए, मैं एक अनुवर्ती सवाल है: मैं कैसे एक स्तंभ के लिए SQLite में bytestrings की दुकान है, जबकि के रूप में अनुकूल यूनिकोड तार डेटा के बाकी रखने करते हैं)
धन्यवाद! मुझे इस पीईपी के बारे में पता नहीं था। यह एक बहुत चालाक समाधान है। – adrian