दिलचस्प पोस्ट
एमजीसी में एक सूची <ऑब्जेक्ट> से रेजर ड्रॉपडाउन सूची बनाना XDocument को XmlDocument में बदलने और इसके विपरीत अजगर में कार्यान्वयन एचएमएसी-एसएचए 1 जावास्क्रिप्ट का उपयोग कर नए पेज को लोड किए बिना ब्राउजर में यूआरएल बदलें PHP कॉन्फ़िगरेशन: सिस्टम की टाइमज़ोन सेटिंग्स पर भरोसा करना सुरक्षित नहीं है कम क्रम में जावा में ArrayList <Long> सॉर्ट करने के लिए कैसे? यूआरएल द्वारा रूटडेटा कैसे प्राप्त करें? जावा में बड़ी संख्या विश्व स्तर पर चर को साझा करने के लिए आवेदन प्रदान करना Matplotlib और प्लॉट रंग स्केल का उपयोग करके अपना रंगमेट बनाएं निर्दिष्ट स्थिति पर तत्व प्राप्त करें – जावास्क्रिप्ट जावा में एक यूआरएल या यूआरआर बनाने के लिए मुहावरेदार तरीका क्या है? अनपेक्षित टॉप-ऊपरी अवतार: com.android.dex.DexException: एकाधिक डीएक्स फ़ाइलें परिभाषित करती हैं कॉलिगनिटर लाइब्रेरी के रूप में मेलजेट एपीआई v3 रैपर को एकीकृत करना संपादन टेक्स्ट के लिए स्वत: सुझाव बंद करें?

यूनिकोड (यूटीएफ -8) पायथन में फ़ाइलों को पढ़ने और लिखना

मुझे एक फ़ाइल में पाठ पढ़ने और लिखने को समझने में कुछ मस्तिष्क की विफलता हो रही है (पायथन 2.4)।

# The string, which has an a-acute in it. ss = u'Capit\xe1n' ss8 = ss.encode('utf8') repr(ss), repr(ss8) 

("यू 'कैपिट \ xe1n' ',' 'कैपिट \ xc3 \ xa1n' ')

 print ss, ss8 print >> open('f1','w'), ss8 >>> file('f1').read() 'Capit\xc3\xa1n\n' 

तो मैं Capit\xc3\xa1n में अपने पसंदीदा संपादक में Capit\xc3\xa1n करता हूँ, फ़ाइल F2 में।

फिर:

 >>> open('f1').read() 'Capit\xc3\xa1n\n' >>> open('f2').read() 'Capit\\xc3\\xa1n\n' >>> open('f1').read().decode('utf8') u'Capit\xe1n\n' >>> open('f2').read().decode('utf8') u'Capit\\xc3\\xa1n\n' 

मैं यहाँ क्या समझ नहीं रहा हूं? स्पष्ट रूप से जादू की कुछ महत्वपूर्ण बिट (या अच्छी भावना) मुझे याद आ रही है उचित रूपांतरण प्राप्त करने के लिए पाठ फ़ाइलों में एक प्रकार क्या है?

मैं वास्तव में भड़काऊ नहीं होने के कारण, यूटीएफ -8 का प्रतिनिधित्व क्या है, अगर आप वास्तव में अजगर को पहचान नहीं सकते हैं, जब यह बाहर से आता है। हो सकता है कि मुझे सिर्फ JSON को स्ट्रिंग डंप करना चाहिए और इसके बजाय इसका उपयोग करना चाहिए, क्योंकि उसके पास एक असीजे प्रतिनिधित्व है! अधिक बात करने के लिए, क्या इस यूनिकोड वस्तु का एक एएससीआईआई प्रतिनिधित्व है जो पायथन एक फाइल से आते समय पहचान और डीकोड करेगा? यदि हां, तो मैं इसे कैसे प्राप्त करूं?

 >>> print simplejson.dumps(ss) '"Capit\u00e1n"' >>> print >> file('f3','w'), simplejson.dumps(ss) >>> simplejson.load(open('f3')) u'Capit\xe1n' 

वेब के समाधान से एकत्रित समाधान "यूनिकोड (यूटीएफ -8) पायथन में फ़ाइलों को पढ़ने और लिखना"

संकेतन में

 u'Capit\xe1n\n' 

"\ xe1" सिर्फ एक बाइट का प्रतिनिधित्व करता है "\ x" आपको बताता है कि "e1" हेक्साडेसिमल में है जब आप लिखते हैं

 Capit\xc3\xa1n 

आपकी फ़ाइल में आपके पास "\ xc3" है ये 4 बाइट्स हैं और आपके कोड में आप सभी को पढ़ते हैं। आप इसे देख सकते हैं जब आप उन्हें देख सकते हैं:

 >>> open('f2').read() 'Capit\\xc3\\xa1n\n' 

आप देख सकते हैं कि बैकस्लैश एक बैकस्लैश से भाग गया है। तो आपके पास आपकी स्ट्रिंग में चार बाइट हैं: "\", "x", "c" और "3"

संपादित करें:

जैसा कि अन्य लोगों ने अपने जवाब में बताया है कि आपको एडिटर में वर्ण दर्ज करना चाहिए और आपके संपादक को यूटीएफ -8 में रूपांतरण संभालना चाहिए और इसे सहेजना चाहिए।

यदि आपके पास वास्तव में इस स्ट्रिंग में स्ट्रिंग है तो आप स्ट्रिंग_स्पेस कोडेक का उपयोग सामान्य स्ट्रिंग में डीकोड करने के लिए कर सकते हैं:

 In [15]: print 'Capit\\xc3\\xa1n\n'.decode('string_escape') Capitán 

नतीजा एक स्ट्रिंग है जो यूटीएफ -8 में एन्कोड किया गया है जहां \\xc3\\xa1 दो बाइट्स द्वारा प्रस्तुत किया गया है जो मूल स्ट्रिंग में \\xc3\\xa1 लिखे गए थे। यदि आप एक यूनिकोड स्ट्रिंग चाहते हैं तो आपको यूटीएफ -8 के साथ फिर से डीकोड करना होगा।

आपके संपादन के लिए: आपकी फ़ाइल में आपके पास UTF-8 नहीं है। यह देखने के लिए कि यह कैसा दिखेगा:

 s = u'Capit\xe1n\n' sutf8 = s.encode('UTF-8') open('utf-8.out', 'w').write(sutf8) 

अपने संपादक के साथ सहेजी गई फ़ाइल की सामग्री के लिए फ़ाइल utf-8.out की सामग्री की तुलना करें।

सांकेतिक शब्दों में बदलना और डीकोड विधियों के साथ गड़बड़ करने के बजाय मुझे फ़ाइल खोलते समय एन्कोडिंग निर्दिष्ट करना आसान लगता है। io.open मॉड्यूल (पायथन 2.6 में जोड़ा गया) एक io.open फ़ंक्शन प्रदान करता है, जिसमें एक एन्कोडिंग पैरामीटर है।

io मॉड्यूल से खुली विधि का उपयोग करें

 >>>import io >>>f = io.open("test", mode="r", encoding="utf-8") 

फिर एफ के पठन () फ़ंक्शन को कॉल करने के बाद, एक एन्कोडेड यूनिकोड ऑब्जेक्ट वापस किया जाता है।

 >>>f.read() u'Capit\xe1l\n\n' 

ध्यान दें कि पायथन 3 में, io.read फ़ंक्शन, io.read समारोह के लिए एक उपनाम है। अंतर्निहित पठन फंक्शन केवल पायथन 3 में एन्कोडिंग तर्क का समर्थन करता है, पायथन 2 नहीं।

संपादित करें: पहले यह जवाब codecs मॉड्यूल की सिफारिश की। कोडक मॉड्यूल समस्याओं को पैदा कर सकता है जब read() और readline() , तो यह उत्तर अब इसके बजाय io मॉड्यूल की सिफारिश करता है।

कोडेक मॉड्यूल से खुली विधि का उपयोग करें।

 >>>import codecs >>>f = codecs.open("test", "r", "utf-8") 

फिर एफ के पठन () फ़ंक्शन को कॉल करने के बाद, एक एन्कोडेड यूनिकोड ऑब्जेक्ट वापस किया जाता है।

 >>>f.read() u'Capit\xe1l\n\n' 

यदि आपको कोई फ़ाइल की एन्कोडिंग पता है, तो codecs पैकेज का उपयोग करना बहुत कम भ्रमित होने वाला है।

http://docs.python.org/library/codecs.html#codecs.open देखें

इसलिए, मुझे जो मैं देख रहा हूं, उसके लिए एक समाधान मिला है, जो है:

 print open('f2').read().decode('string-escape').decode("utf-8") 

यहां कुछ असामान्य कोडेक हैं जो यहां उपयोगी हैं। यह विशेष रूप से पढ़ने से यूटीएफ -8 अभ्यावेदन को पायथन के भीतर से लेने की अनुमति मिलती है, उन्हें एक एएससीआईआई फ़ाइल में प्रतिलिपि बनाएं, और उन्हें यूनिकोड में पढ़ा जाए। "स्ट्रिंग-एस्केप" डीकोड के तहत, स्लैश को दोगुना नहीं किया जाएगा।

इससे मुझे राउंड ट्रिप के लिए अनुमति मिलती है जिसे मैं कल्पना कर रहा था।

 # -*- encoding: utf-8 -*- # converting a unknown formatting file in utf-8 import codecs import commands file_location = "jumper.sub" file_encoding = commands.getoutput('file -b --mime-encoding %s' % file_location) file_stream = codecs.open(file_location, 'r', file_encoding) file_output = codecs.open(file_location+"b", 'w', 'utf-8') for l in file_stream: file_output.write(l) file_stream.close() file_output.close() 

अब आपको केवल Python3 में आवश्यक है open(Filename, 'r', encoding='utf-8')

[अनुरोधित स्पष्टीकरण के लिए 2016-02-10 को संपादित करें]

पायथन 3 ने अपने खुले फ़ंक्शन को एन्कोडिंग पैरामीटर जोड़ा। ओपन फंक्शन के बारे में निम्नलिखित जानकारी यहां से एकत्र की गई है: https://docs.python.org/3/library/functions.html#open

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

एन्कोडिंग फ़ाइल एन्कोडिंग या एन्कोड करने के लिए उपयोग किए जाने वाले एन्कोडिंग का नाम है। यह केवल पाठ मोड में ही इस्तेमाल किया जाना चाहिए। डिफ़ॉल्ट एन्कोडिंग प्लेटफॉर्म पर निर्भर है (जो भी लोकेल.जेट्रेफ़ेयरएडेनकोडिंग ( रिटर्न) देता है), लेकिन पायथन द्वारा समर्थित किसी भी टेक्स्ट एन्कोडिंग का उपयोग किया जा सकता है। समर्थित एनकोडिंग की सूची के लिए कोडेक मॉड्यूल देखें

इसलिए encoding='utf-8' को खुले फ़ंक्शन के पैरामीटर के रूप में जोड़कर, फ़ाइल को पढ़ने और लिखना सभी को encoding='utf-8' रूप में किया जाता है (जो अब भी पायथन में किया गया हर चीज का डिफ़ॉल्ट एन्कोडिंग है।)

असल में, यह मेरे लिए Python 3.2 में यूटीएफ -8 एन्कोडिंग के साथ फाइल पढ़ने के लिए काम करता है:

 import codecs f = codecs.open('file_name.txt', 'r', 'UTF-8') for line in f: print(line) 

यूनिकोड स्ट्रिंग में पढ़ने के लिए और फिर एचटीएमएल को भेजें, मैंने यह किया:

 fileline.decode("utf-8").encode('ascii', 'xmlcharrefreplace') 

अजगर संचालित एचटीटीपी सर्वरों के लिए उपयोगी

ठीक है, आपके पसंदीदा पाठ संपादक का यह एहसास नहीं है कि \xc3\xa1 को अक्षर शाब्दिक माना जाता है, लेकिन यह उन्हें पाठ के रूप में व्याख्या करता है। यही कारण है कि आप पिछली लाइन में डबल बैकस्लैश प्राप्त करते हैं – अब आपकी फ़ाइल में एक असली बैकस्लैश + xc3 आदि है।

यदि आप पायथन में एन्कोडेड फ़ाइलों को पढ़ना और लिखना चाहते हैं, तो सबसे अच्छा कोडक मॉड्यूल का उपयोग करें।

टर्मिनल और एप्लिकेशन के बीच पाठ चिपकाना मुश्किल है, क्योंकि आपको नहीं पता कि कौन सा प्रोग्राम आपके एन्कोडिंग का उपयोग करके आपके टेक्स्ट की व्याख्या करेगा। आप निम्न प्रयास कर सकते हैं:

 >>> s = file("f1").read() >>> print unicode(s, "Latin-1") Capitán 

फिर इस स्ट्रिंग को अपने संपादक में पेस्ट करें और सुनिश्चित करें कि यह लैटिन-1 का उपयोग करके इसे स्टोर करता है। इस धारणा के तहत कि क्लिपबोर्ड स्ट्रिंग को ढेर नहीं करता, गोल यात्रा को काम करना चाहिए।

आपने एन्कोडिंग के साथ सामान्य समस्या पर ठोकर खाई है: मैं यह कैसे बता सकता हूं कि फाइल किस एन्कोडिंग में है?

उत्तर: जब तक फ़ाइल स्वरूप इस के लिए प्रदान नहीं करता तब तक आप नहीं कर सकते। एक्सएमएल, उदाहरण के लिए, से शुरू होता है:

 <?xml encoding="utf-8"?> 

यह शीर्षक सावधानी से चुना गया था ताकि यह पढ़ा जा सके कोई बात नहीं एन्कोडिंग। आपके मामले में, ऐसा कोई संकेत नहीं है, इसलिए न तो आपके संपादक और न ही पायथन का कोई भी विचार है जो चल रहा है। इसलिए, आपको codecs मॉड्यूल का उपयोग करना होगा और codecs.open(path,mode,encoding) उपयोग करना चाहिए जो पायथन में अनुपलब्ध बिट प्रदान करता है।

आपके संपादक के लिए, आपको यह जांचना होगा कि क्या वह फाइल के एन्कोडिंग को सेट करने के लिए कुछ तरीके प्रदान करता है।

यूटीएफ -8 का मुद्दा 21-बिट अक्षरों (यूनिकोड) को 8-बिट डेटा स्ट्रीम के रूप में एन्कोड करने में सक्षम होना है (क्योंकि यह दुनिया की सभी कंप्यूटरों को संभाल सकता है केवल एक ही चीज़ है)। लेकिन जब से अधिकांश ओएस यूनिकोड युग की भविष्यवाणी करते हैं, तो उनके पास हार्ड डिस्क पर फ़ाइलों को एन्कोडिंग जानकारी संलग्न करने के लिए उपयुक्त उपकरण नहीं हैं।

अगला मुद्दा पायथन में प्रतिनिधित्व है यह पूरी तरह से हेइकोगरलाच की टिप्पणी में समझाया गया है । आपको समझना चाहिए कि आपका कंसोल केवल एएससीआईआई दिखा सकता है यूनिकोड या कुछ को प्रदर्शित करने के लिए> = 128 चोरोड, इसे बचने के कुछ माध्यमों का उपयोग करना चाहिए। आपके संपादक में, आपको बचने वाली प्रदर्शन स्ट्रिंग को नहीं लिखना चाहिए, लेकिन स्ट्रिंग का मतलब क्या है (इस मामले में, आपको umlaut दर्ज करना होगा और फ़ाइल को सहेजना होगा)।

उसने कहा, आप एक स्ट्रिंग में पलायन स्ट्रिंग को चालू करने के लिए पायथन फ़ंक्शन eval () का उपयोग कर सकते हैं:

 >>> x = eval("'Capit\\xc3\\xa1n\\n'") >>> x 'Capit\xc3\xa1n\n' >>> x[5] '\xc3' >>> len(x[5]) 1 

जैसा कि आप देख सकते हैं, स्ट्रिंग "\ xc3" को एक एकल वर्ण में बदल दिया गया है। यह अब 8-बिट स्ट्रिंग है, यूटीएफ -8 एन्कोडेड। यूनिकोड प्राप्त करने के लिए:

 >>> x.decode('utf-8') u'Capit\xe1n\n' 

ग्रेग Lind ने पूछा: मुझे लगता है कि यहां कुछ टुकड़े गायब हैं: फ़ाइल F2 में शामिल हैं: हेक्स:

 0000000: 4361 7069 745c 7863 335c 7861 316e Capit\xc3\xa1n 

codecs.open('f2','rb', 'utf-8') , उदाहरण के लिए, उन सभी को अलग-अलग वर्णों में पढ़ा जाता है (अपेक्षित) क्या एएससीआईआई में फ़ाइल को लिखने का कोई तरीका है जो काम करेगा?

उत्तर: इसका मतलब आप पर निर्भर करता है। एएससीआईआई अक्षरों का प्रतिनिधित्व नहीं कर सकता> 127. तो आपको कुछ कहने की ज़रूरत है "अगले कुछ अक्षरों का अर्थ कुछ खास है" जो कि क्रम "\ x" करता है यह कहते हैं: अगले दो अक्षर एक एकल वर्ण का कोड हैं। "यू \" यूनिकोड को 0xFFFF (65535) तक एन्कोड करने के लिए चार अक्षर का उपयोग करता है।

तो आप सीधे यूनिकोड को एएससीआईआई को नहीं लिख सकते हैं (क्योंकि एएससीआईआई में केवल एक ही अक्षर नहीं है)। आप इसे स्ट्रिंग पलायन के रूप में लिख सकते हैं (जैसा कि F2 में है); इस मामले में, फाइल को एएससीआईआई के रूप में प्रस्तुत किया जा सकता है। या आप इसे यूटीएफ -8 के रूप में लिख सकते हैं, इस स्थिति में, आपको 8-बिट सुरक्षित स्ट्रीम की आवश्यकता है

decode('string-escape') का उपयोग करके आपका समाधान काम करता है, लेकिन आपको पता होना चाहिए कि आप कितनी मेमोरी का उपयोग करते हैं: codecs.open() का उपयोग करने की मात्रा तीन गुना।

याद रखें कि कोई फ़ाइल 8 बिट्स के साथ बाइट्स का एक क्रम है। न तो बिट्स और न ही बाइट्स का अर्थ है। यह आप है जो कहते हैं "65 साधन 'ए'" चूंकि \xc3\xa1 "ए" बनना चाहिए, लेकिन कंप्यूटर को जानने का कोई मतलब नहीं है, आपको फ़ाइल को लिखने के दौरान उपयोग किए जाने वाले एन्कोडिंग को निर्दिष्ट करके बता देना चाहिए।

\ X। अनुक्रम कुछ है जो पायथन के लिए विशिष्ट है यह एक सार्वभौमिक बाइट एस्केप अनुक्रम नहीं है

आप वास्तव में UTF-8-encoded non-ASCII में प्रवेश कैसे करते हैं आपके ओएस और / या आपके संपादक पर निर्भर करता है। यहां बताया गया है कि आप इसे विंडोज में कैसे करते हैं ओएस एक्स के लिए तीव्र उच्चारण के साथ प्रवेश करने के लिए आप केवल विकल्प + , फिर , और ओएस एक्स का समर्थन यूटीएफ -8 में लगभग सभी पाठ संपादक मार सकते हैं।

codecs.open() अलावा, codecs.open() फाइल को पढ़ने / लिखने के लिए कोई भी पायथन 2 या पायथन 3 के साथ काम करने के लिए io.open() का उपयोग कर सकता है

उदाहरण

 import io text = u'á' encoding = 'utf8' with io.open('data.txt', 'w', encoding=encoding, newline='\n') as fout: fout.write(text) with io.open('data.txt', 'r', encoding=encoding, newline='\n') as fin: text2 = fin.read() assert text == text2 

आप यूनिकोड फाइलों के साथ काम करने के लिए मूल open() फंक्शन में सुधार कर सकते हैं, partial फ़ंक्शन का उपयोग करके इसे जगह में बदल सकते हैं। इस समाधान की सुंदरता आपको किसी भी पुराने कोड को बदलने की आवश्यकता नहीं है। यह पारदर्शी है

 import codecs import functools open = functools.partial(codecs.open, encoding='utf-8') 

मैं पायथन 2.7.9 का उपयोग कर iCal को पार्स करने की कोशिश कर रहा था:

कैलेंडर से कैलेंडर कैलेंडर आयात करें

लेकिन मैं मिल रहा था:

  Traceback (most recent call last): File "ical.py", line 92, in parse print "{}".format(e[attr]) UnicodeEncodeError: 'ascii' codec can't encode character u'\xe1' in position 7: ordinal not in range(128) 

और इसे ठीक से तय किया गया था:

 print "{}".format(e[attr].encode("utf-8")) 

(अब इसे प्रिंट पसंद कर सकते हैं।)