2014-07-22 5 views
5

मैं एक पार मंच रास्ते में डिफ़ॉल्ट open()(io.open() in 2.7) पाठ एन्कोडिंग बदल सकते हैं?क्या Python के खुले() डिफ़ॉल्ट टेक्स्ट एन्कोडिंग को बदलने का कोई तरीका है?

तो यह है कि मैं हर बार open(...,encoding='utf-8') निर्दिष्ट करने की आवश्यकता नहीं किया था।

पाठ मोड में, एन्कोडिंग प्रयुक्त एन्कोडिंग निर्दिष्ट नहीं है, तो मंच निर्भर है: locale.getpreferredencoding(False) वर्तमान स्थान एन्कोडिंग पाने के लिए कहा जाता है।

हालांकि दस्तावेज निर्दिष्ट नहीं करता है कि कैसे पसंदीदा एन्कोडिंग सेट करें। समारोह locale मॉड्यूल में है, इसलिए मुझे लोकेल बदलने की जरूरत है? क्या यूटीएफ -8 लोकेल सेट करने के लिए कोई विश्वसनीय क्रॉस-प्लेटफार्म तरीका है? क्या यह डिफ़ॉल्ट टेक्स्ट फ़ाइल एन्कोडिंग के अलावा किसी और चीज को प्रभावित करेगा?

या स्थान परिवर्तन खतरनाक होते हैं (कुछ तोड़ सकते हैं), और मैं करने के लिए छड़ी चाहिए कस्टम आवरण जैसे:

def uopen(*args, **kwargs): 
    return open(*args, encoding='UTF-8', **kwargs) 

उत्तर

3

स्थान या क्योंकि वरीय एन्कोडिंग बदलने के मत करो;

  • यह आपके कोड के अन्य हिस्सों (या पुस्तकालयों का उपयोग कर रहे हैं) को प्रभावित कर सकता है; और
  • यह स्पष्ट है कि अपने कोड एक विशिष्ट एन्कोडिंग का उपयोग open पर निर्भर करता है हो सकता है नहीं होते।

इसके बजाय, एक सरल आवरण का उपयोग करें:

from functools import partial 
open_utf8 = partial(open, encoding='UTF-8') 

यह दो अन्य लाभ हैं:

  • आप सभी कीवर्ड तर्क के लिए चूक निर्दिष्ट कर सकते हैं (आप की जरूरत है चाहिए)।
  • फ़ंक्शन को कॉल करते समय आप डिफ़ॉल्ट को ओवरराइड कर सकते हैं।
+0

फ़ंक्शन को लपेटने का यह सही तरीका है। +1 – user

+0

मैंने 'locale.setlocale()' का प्रयास किया है और यह विंडोज़ पर डिफ़ॉल्ट एन्कोडिंग नहीं बदला है। यहां तक ​​कि एक अलग गैर-यूनिकोड एक भी। इसलिए मैंने सीपीथॉन के स्रोत कोड का निरीक्षण करने का निर्णय लिया और पाया कि 'getpreferredencoding' [उपयोग] (https://github.com/python/cpython/blob/f7eae0adfcd4c50034281b2c69f461b43b68db84/Modules/_localemodule.c#L304) [GetACP] (https://msdn.microsoft.com/en-us/library/windows/desktop/dd318070(v=vs.85).aspx) WinAPI फ़ंक्शन, यह "वर्तमान विंडोज एएनएसआई कोड पेज पहचानकर्ता पुनर्प्राप्त करता है"। – user

+0

इस व्यवहार को ओवरराइड करने के लिए पाइथन में कोई तंत्र नहीं है, संस्करण के आश्रित हैक का उपयोग करने के अलावा जोरन द्वारा दूसरे उत्तर में सुझाए गए सुझाव और [इस प्रश्न] के उत्तरों में पाए गए (https://stackoverflow.com/questions/ 31469707/बदलते-स्थान-वरीय एन्कोडिंग-इन-अजगर-3-में-विंडोज़)। मैंने जो पढ़ा है, उससे पाइथन के बाहर विंडोज़ में इस एन्कोडिंग को यूटीएफ -8 में सेट करने के लिए कोई तंत्र नहीं है। इसलिए, इस तथ्य को देखते हुए कि हैक्स का उपयोग किये बिना इस वरीयता को सेट करने का कोई तरीका नहीं है, मैं सहमत हूं कि इसे बदलना अविश्वसनीय हो सकता है। जवाब स्वीकार किया गया। – user

0

मैं locale में कुछ भी परिवर्तन नहीं होगा, क्योंकि यह में साइड इफेक्ट का एक बहुत हो सकता था आपके सिस्टम के अन्य हिस्सों। open एक सिस्टम स्तरीय फ़ंक्शन कॉल है, इसलिए इसकी सेटिंग्स के बाहर प्रभाव हो सकता है, या कम से कम अन्य पायथन प्रोग्राम जो समान पायथन इंस्टॉलेशन का उपयोग करते हैं। आपका रैपर उचित दिखता है, बहुत साफ और पोर्टेबल है, और सही समाधान दिखता है।

2

आप एन्कोडिंग सेट कर सकते हैं ... लेकिन इसके सच में hacky

import sys 
sys.getdefaultencoding() #should print your default encoding 
sys.setdefaultencoding("utf8") #error ... no setdefaultencoding ... but... 
reload(sys) 
sys.setdefaultencoding("utf8") #now it succeeds ... 

मैं बजाय

import __builtin__ 
old_open = open 
def uopen(*args, **kwargs): 
    return open(*args, encoding='UTF-8', **kwargs) 
__builtin__.open = uopen 

तो कहीं भी आप open कहीं भी होगी कॉल करना होगा main_script.py UTF8 एन्कोडिंग का उपयोग करें ... लेकिन यह करता है, तो आप स्पष्ट रूप से कोई एन्कोडिंग जोड़ने आप त्रुटियों दे सकता है

या सिर्फ स्पष्ट रूप से एन्कोडिंग किसी फ़ाइल को खोलने, या अपने आवरण का उपयोग किसी भी समय पारित ...

अजगर सामान्य दर्शन स्पष्ट है अंतर्निहित तुलना में बेहतर है, जिसका मतलब है "सही" समाधान स्पष्ट रूप से अपने एन्कोडिंग घोषित करने के लिए है जब एक फ़ाइल खोलने ...

+0

डिफ़ॉल्ट एन्कोडिंग के साथ हैक केवल पायथन 2. – user

+0

पर काम करता है मुझे यकीन है कि अगर यह सिर्फ 'builtins' में समारोह अधिलेखित करने के लिए के रूप में वह भी पहले से ही आयातित मॉड्यूल में समारोह को संशोधित करता है सुरक्षित है और कुछ पुस्तकालयों पर भरोसा कर सकते नहीं कर रहा हूँ डिफ़ॉल्ट मान। फिर भी, यह कुछ मामलों में काम में आ सकता है। धन्यवाद, +1 – user

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

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