2008-10-06 13 views
20

मैं एक तृतीय पक्ष उपकरण का उपयोग करता हूं जो यूनिकोड प्रारूप में फ़ाइल आउटपुट करता है। हालांकि, मैं इसे एएससीआईआई में पसंद करता हूं। टूल में फ़ाइल प्रारूप को बदलने के लिए सेटिंग्स नहीं हैं।मैं पाइथन का उपयोग कर यूनिकोड से ASCII तक फ़ाइल के प्रारूप को कैसे परिवर्तित करूं?

पायथन का उपयोग कर पूरे फ़ाइल प्रारूप को परिवर्तित करने का सबसे अच्छा तरीका क्या है?

उत्तर

41

आप फ़ाइल को आसानी से unicode फ़ंक्शन का उपयोग करके आसानी से परिवर्तित कर सकते हैं, लेकिन आप सीधे ASCII समकक्ष के बिना यूनिकोड वर्णों के साथ समस्याओं में भाग लेंगे।

This blogunicodedata मॉड्यूल की सिफारिश करता है, जो लगभग सीधे ASCII मानों के बिना वर्णों को परिवर्तित करने की देखभाल करता है, उदाहरण के लिए

>>> title = u"Klüft skräms inför på fédéral électoral große" 

आम तौर पर

Klft skrms infr p fdral lectoral groe 

जो बहुत गलत है में बदल जाती है। हालांकि, unicodedata मॉड्यूल का उपयोग कर, परिणाम बहुत मूल पाठ के करीब हो सकता है:

>>> import unicodedata 
>>> unicodedata.normalize('NFKD', title).encode('ascii','ignore') 
'Kluft skrams infor pa federal electoral groe' 
+0

वह बहुत अच्छा है, सिवाय इसके कि (जैसा कि ध्यान दिया गया है) यह कुछ पात्रों को याद करता है। लैटिन -1 के लिए, आपको विशेष मामले की आवश्यकता है Æ, Ð, Ø, Þ, æ, ð, ø, ß, और þ। – giltay

+0

फ्रेडरिक लन्ध ने विशेष मामले प्रतिस्थापन के लिए 'यूनिकोडेडटाटा' के शीर्ष पर निर्माण करने के लिए एक साधारण लिपि के साथ इस पर पोस्ट किया: http://effbot.org/zone/unicode-convert.htm – rcoup

11

मुझे लगता है कि यह का एहसास करने से आपको गहरा मुद्दा है। यूनिकोड से एएससीआईआई में फ़ाइल को बस बदलना आसान है, हालांकि, सभी यूनिकोड वर्णों को उचित ASCII समकक्षों में अनुवाद करने के लिए प्राप्त करना (कई अक्षरों को दोनों एन्कोडिंग में उपलब्ध नहीं है) एक और है।

अजगर 1.6 भी: http://www.reportlab.com/i18n/python_unicode_tutorial.html

यहाँ साइट से एक उपयोगी उद्धरण है:

यह अजगर यूनिकोड ट्यूटोरियल तुम क्या यूनिकोड तार कि ASCII करने के लिए अनुवाद किया जा रहा करने के लिए होता का एक बेहतर विचार दे सकते हैं

: जो आप एन्कोडिंग निर्दिष्ट कर सकते हैं के लिए एक "यूनिकोड" में निर्मित समारोह, हो जाता है

इन तीनों में से एक ही चीज़ लौटाता है, क्योंकि 'हैलो' में वर्ण सभी तीन एन्कोडिंग के लिए आम हैं।

अब यूरोपीय उच्चारण के साथ कुछ एन्कोड करें, जो ASCII के बाहर है। कंसोल में आप जो देखते हैं वह आपके ऑपरेटिंग सिस्टम लोकेल पर निर्भर करता है; विंडोज मुझे आईएसओ-लैटिन -1 में टाइप करने देता है।

> >>> a = unicode('André','latin-1') 
> >>> a u'Andr\202' 

आप टाइप नहीं कर सकते तो एक तीव्र पत्र ई, आप स्ट्रिंग 'Andr \ 202', जो स्पष्ट है डाल सकते हैं।

यूनिकोड सभी सामान्य संचालन जैसे कि पुनरावृत्ति और विभाजन का समर्थन करता है। हम उन्हें पर नहीं चलाएंगे।

+1

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

+1

@ रे वेगा: कि आप अभी इस बारे में जानते हैं। यह एक गलती और संभावित बग है कि यह मानने के लिए कि यूनिकोड डेटा में केवल ASCII वर्ण होंगे। –

2
इस तरह

:

uc = open(filename).read().decode('utf8') 
ascii = uc.decode('ascii') 

नोट, तथापि, कि इस होगा एक UnicodeDecodeError अपवाद के साथ असफल अगर कोई अक्षर हैं जो ASCII में परिवर्तित नहीं किया जा सकता है।

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

2

यहाँ एन्कोडिंग अनुवाद करने के लिए कुछ सरल (और मूर्ख) कोड है। मैं मान रहा हूं (लेकिन आपको नहीं करना चाहिए) कि इनपुट फ़ाइल यूटीएफ -16 में है (विंडोज़ इसे बस 'यूनिकोड' कहते हैं)।

input_codec = 'UTF-16' 
output_codec = 'ASCII' 

unicode_file = open('filename') 
unicode_data = unicode_file.read().decode(input_codec) 
ascii_file = open('new filename', 'w') 
ascii_file.write(unicode_data.write(unicode_data.encode(output_codec))) 

ध्यान दें कि यूनिकोड फ़ाइल में कोई भी वर्ण होने पर यह काम नहीं करेगा यदि ASCII वर्ण भी नहीं हैं। आप में अपरिचित वर्ण चालू करने के लिए निम्न कर सकते हैं रों '?':

ascii_file.write(unicode_data.write(unicode_data.encode(output_codec, 'replace'))) 

बाहर the docs अधिक सरल विकल्प की जांच करें। यदि आपको कुछ और परिष्कृत करने की आवश्यकता है, तो आप पाइथन कुकबुक पर The UNICODE Hammer को देखना चाहेंगे।

0

यह ध्यान रखना महत्वपूर्ण है कि कोई 'यूनिकोड' फ़ाइल प्रारूप नहीं है। यूनिकोड कई अलग-अलग तरीकों से बाइट्स को एन्कोड किया जा सकता है। आमतौर पर यूटीएफ -8 या यूटीएफ -16। आपको यह जानने की आवश्यकता होगी कि आपका तृतीय-पक्ष टूल कौन सा आउटपुट कर रहा है। एक बार जब आप जानते हैं कि, विभिन्न एन्कोडिंग के बीच परिवर्तित बहुत आसान है:

in_file = open("myfile.txt", "rb") 
out_file = open("mynewfile.txt", "wb") 

in_byte_string = in_file.read() 
unicode_string = bytestring.decode('UTF-16') 
out_byte_string = unicode_string.encode('ASCII') 

out_file.write(out_byte_string) 
out_file.close() 

के रूप में अन्य उत्तर में बताया गया है, तो आप शायद एनकोड विधि करने के लिए एक त्रुटि हैंडलर की आपूर्ति करना चाहते हैं जा रहे हैं। त्रुटि प्रतिस्थापन के रूप में 'प्रतिस्थापन' का उपयोग करना सरल है, लेकिन यदि आपके पास ऐसे अक्षर हैं जिन्हें ASCII में प्रदर्शित नहीं किया जा सकता है, तो आपके टेक्स्ट को उलझाएंगे।

0

जैसा कि अन्य पोस्टर ने नोट किया है, ASCII यूनिकोड का सबसेट है।

लेकिन यदि आप:

  • लेगेसी एप्लिकेशन
  • है तो आपको उस एप्लिकेशन
  • क्या आप वाकई अपने इनपुट ASCII सबसेट
में गिर जाता है कर रहे हैं के लिए कोड को नियंत्रित नहीं करते

फिर नीचे दिया गया उदाहरण दिखाता है कि यह कैसे करें:

mystring = u'bar' 
type(mystring) 
    <type 'unicode'> 

myasciistring = (mystring.encode('ASCII')) 
type(myasciistring) 
    <type 'str'> 
2

मेरी समस्या जहां मैं बस केवल ascii उत्पादन गैर- ASCII वर्ण और सिर्फ उत्पादन को छोड़ करना चाहता था के लिए, नीचे समाधान वास्तव में अच्छी तरह से काम:

import unicodedata 
    input = open(filename).read().decode('UTF-16') 
    output = unicodedata.normalize('NFKD', input).encode('ASCII', 'ignore') 
3

वैसे, इन एक लिनक्स कमांड iconv यह करने के लिए है प्रकार की नौकरी।

iconv -f utf8 -t ascii <input.txt >output.txt 
संबंधित मुद्दे