2012-04-07 5 views
13

मैं एक पायथन टूल पर काम कर रहा हूं जो यूटीएफ -8 और यूटीएफ -16 एन्कोडिंग की फाइलें खोलने में सक्षम होना चाहिए।मैं पाइथन 2.x पर यूटीएफ -16 फाइल कैसे खोल सकता हूं?

def readGridFromPath(self, filepath): 
    try: 
     self.readGridFromFile(open(filepath,'r',encoding='utf-8')) 
    except UnicodeDecodeError: 
      self.readGridFromFile(open(filepath,'r',encoding='utf-16')) 

(readGridFromFile या तो के माध्यम से पूरा होने तक चलेगा, या बढ़ा: अजगर 3.2 में, मैं निम्नलिखित कोड का उपयोग UTF-8 का उपयोग कर फ़ाइल खोलने का प्रयास करने, फिर वहाँ एक यूनिकोड त्रुटि है, तो UTF-16 के साथ प्रयास करें । एक UnicodeDecodeError)

हालांकि, जब मैं पायथन 2.x में इस कोड को चलाने के लिए, मैं:

TypeError: 'encoding' is an invalid keyword argument for this function 

मैं डॉक्स कि अजगर 2.x के open() एक encoding कीवर्ड नहीं है में देखते हैं। क्या इस के आसपास कोई रास्ता है जो मुझे अपना कोड पायथन 2.x संगत बनाने की अनुमति देगा?

import io 

def readGridFromPath(self, filepath): 
    try: 
     self.readGridFromFile(io.open(filepath, 'r', encoding='utf-8')) 
    except UnicodeDecodeError: 
     self.readGridFromFile(io.open(filepath, 'r', encoding='utf-16')) 


io.open विस्तार से here वर्णित है:

उत्तर

20

io.open ड्रॉप-में अपनी आवश्यकताओं के लिए प्रतिस्थापन, तो कोड नमूना आप पायथन 2.x में इस प्रकार दिखेगा उपलब्ध करा चुके हैं। इसके प्रोटोटाइप है:

io.open(file, mode='r', buffering=-1, encoding=None, errors=None, newline=None, closefd=True)

io मॉड्यूल ही अजगर 2.x और अजगर 3.x के बीच संगतता परत के रूप में डिजाइन किया गया था, Py3k लेनदेन की आसानी और बैक-पोर्टिंग और मौजूदा पायथन 2.x कोड के रखरखाव आसान बनाने के लिए।

कृपया यह भी नोट codecs.open का उपयोग कर एक चेतावनी, it works in binary mode only के रूप में हो सकता है कि:

Note: Files are always opened in binary mode, even if no binary mode was specified. This is done to avoid data loss due to encodings using 8-bit values. This means that no automatic conversion of '\n'` is done on reading and writing.

इसके अलावा आप मैन्युअल रूप से पता लगाने और UTF8 बीओएम बाहर अलग करना के मुद्दों में चला सकते हैं - codecs.open UTF8 बीओएम u'\ufeff' चरित्र के रूप में इनलाइन छोड़ देता है ।

+0

अच्छी कॉल, 'io.open' बेहतर विकल्प है। हालांकि, 'codecs.open' के नुकसान वास्तव में" अनुपयुक्त ", IMHO कहने के लिए पर्याप्त महत्वपूर्ण नहीं हैं। –

+0

वैसे, 'कोडेक्स.ओपेन' के बारे में दावा सही ढंग से बीओएम को संभालने में नहीं है, यह गलत है (मैंने कोशिश की)। इसके बारे में बात यह नहीं है कि नई लाइनों को स्वचालित रूप से परिवर्तित करना सच है, हालांकि (लेकिन यह एकमात्र अंतर है)। –

+0

मैंने अभी कोशिश की है - यूटीएफ -16 बीई/ली के लिए यह बहुत बढ़िया काम करता है, लेकिन यूटीएफ 8 के लिए इसके बीओएम (ईबी बीबी बीएफ) को डीकोडेड टेक्स्ट में यू '\ ubeff' के रूप में छोड़ दिया गया है। मुझे स्पष्ट रूप से याद है कि मैंने विंडोज़ पर '.decode()' का उपयोग करके बीओएम के साथ समस्याओं को डीकोड किया था, लेकिन अब मैं इसका परीक्षण नहीं कर सकता। मैंने निष्पक्षता के लिए दावा तय कर लिया है। – toriningen

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