पायथन एक फ़ाइल से पढ़ रहा है और utf-8 को सहेज रहा है


81

मुझे किसी फ़ाइल को पढ़ने, उसके स्ट्रिंग को संसाधित करने और UTF-8 फ़ाइल में सहेजने में समस्याएँ हो रही हैं।

यहाँ कोड है:

try:
    filehandle = open(filename,"r")
except:
    print("Could not open file " + filename)
    quit() 

text = filehandle.read()
filehandle.close()

मैं तब चर पाठ पर कुछ प्रसंस्करण करता हूं।

और तब

try:
    writer = open(output,"w")
except:
    print("Could not open file " + output)
    quit() 

#data = text.decode("iso 8859-15")    
#writer.write(data.encode("UTF-8"))
writer.write(text)
writer.close()

यह पूरी तरह से फ़ाइल का उत्पादन करता है, लेकिन यह मेरे संपादक के अनुसार 8859-15 में ऐसा करता है। चूंकि एक ही संपादक इनपुट फ़ाइल (चर फ़ाइल नाम में) को UTF-8 के रूप में पहचानता है, मुझे नहीं पता कि ऐसा क्यों हुआ। जहाँ तक मेरी रीसर्च में दिखाया गया है कि टिप्पणी की गई लाइनों से समस्या का समाधान होना चाहिए। हालाँकि जब मैं उन पंक्तियों का उपयोग करता हूँ जिसके परिणामस्वरूप फ़ाइल में मुख्य रूप से विशेष चरित्र में अस्पष्टता होती है, शब्द टिल्डे के साथ जैसे कि पाठ स्पेनिश में होता है। मैं वास्तव में किसी भी मदद की सराहना करता हूं क्योंकि मैं स्टम्प्ड हूं ...।


2
यह कौन सा संपादक है? कौन सा अजगर संस्करण? यहाँ से यह कोड पूरी तरह से मान्य लगता है और उम्मीद के
मुताबिक

केट संपादक हैं। अजगर --version का उत्पादन Python 2.7.5+
aarelovich

मैंने आपके कोड को 2.6.8, 2.7.5+ और 3.3.2+ के साथ परीक्षण किया है जो सब कुछ ठीक काम करता है। क्या आप कुछ उदाहरण इनपुट प्रदान कर सकते हैं?
शून्य 323

चूंकि टेक्स्ट को कच्चे बाइट्स में संसाधित किया गया था, इसलिए अनदेखी प्रसंस्करण कोड ने संभवतः UTF8 एन्कोडिंग को गड़बड़ कर दिया था।
मार्क टॉलेनन

3
ठीक। मैंने इसे हल कर लिया है। यह ज्यादातर मेरी गलती थी इसलिए सभी को खेद है। यहाँ क्या हुआ है। @MarkTolonen द्वारा प्रदान किया गया कोड काम करता है अगर मैं फ़ाइल खोलते समय utf-8 के बजाय iso-8859-15 को बदलता हूं। हालाँकि जब मेरे संपादक ने मेमोरी से फाइल अपडेट की तो पहले से ही पुरानी एन्कोडिंग लोड होने के कारण यह मुझे अस्पष्ट दिखा। जब मैंने दोबारा फाइल खोली तो यह मुझे ठीक दिखा। आप सभी को धन्यवाद और परेशानियों के लिए खेद है !!!
औरेलोविच

जवाबों:


201

codecsमॉड्यूल का उपयोग करके आपके प्रोग्राम के I / O सीमाओं पर यूनिकोड से पाठ को प्रोसेस करें :

import codecs
with codecs.open(filename, 'r', encoding='utf8') as f:
    text = f.read()
# process Unicode text
with codecs.open(filename, 'w', encoding='utf8') as f:
    f.write(text)

संपादित करें:io मॉड्यूल अब कोडेक के बजाय की सिफारिश की और अजगर 3 के साथ संगत है है openवाक्य रचना है, और अगर अजगर 3 का उपयोग, आप बस का उपयोग कर सकते openहै अगर आप अजगर 2 संगतता की आवश्यकता नहीं है।

import io
with io.open(filename, 'r', encoding='utf8') as f:
    text = f.read()
# process Unicode text
with io.open(filename, 'w', encoding='utf8') as f:
    f.write(text)

6
आपने जैसा मुझे बताया मैंने वैसा ही किया। अन्य सुझाव के साथ एक ही त्रुटि
aarelovich

1
मुझे यह काम करने के लिए मिला है। समस्या मूल फ़ाइल iso-8859-15 थी
औरेलोविच

10
इस पर आने वाले किसी के लिए, कृपया ध्यान दें कि पायथन 3 के लिए open()और io,open()समान हैं। बस उपयोग करें open()। मदद देखें (खोलें) और आप देखेंगे कि यह io.open () के समान है - यहां तक ​​कि हेडिंग भी मॉड्यूल io में बिल्ट-इन फ़ंक्शन ओपन पर मदद की बात कहती है।
शॉन मेहान

1
@arturomp यह भी काम नहीं करेगा। io.openउम्मीद है कि यूनिकोड के तार लिखे जाएंगे, बाइट के तार नहीं। यह घोषित एन्कोडिंग को एन्कोडिंग करता है।
मार्क टोनलन

1
@arturomp सुधार, यह पायथन 3 पर काम नहीं करेगा। पायथन 2 डिफ़ॉल्ट रूप से डिफ़ॉल्ट asciiकोडेक का उपयोग करके बाइट स्ट्रिंग को यूनिकोड में बदल देगा , इसलिए यह तब तक काम करेगा जब तक स्ट्रिंग केवल ASCII है। इसलिए पायथन 3 ने इसे बदल दिया ... यह रोकता है "यह कभी-कभी काम करेगा" जो नीचे ट्रैक करने के लिए एक कष्टप्रद बग है।
मार्क टॉलेनन

10

आप नीचे दिए गए कोड द्वारा भी इसके माध्यम से प्राप्त कर सकते हैं:

file=open(completefilepath,'r',encoding='utf8',errors="ignore")
file.read()

4

आप खुले का उपयोग कर ऐसा नहीं कर सकते। कोडेक्स का उपयोग करें।

जब आप खुले में निर्मित फ़ंक्शन का उपयोग करके अजगर में एक फ़ाइल खोल रहे हैं, तो आप हमेशा फ़ाइल को एएससीआई में पढ़ेंगे / लिखेंगे। Utf-8 में इसे लिखने के लिए इसे आज़माएँ:

import codecs
file = codecs.open('data.txt','w','utf-8')

2
इस की कोशिश की और मुझे एक त्रुटि मिली: यूनिकोडडाउज़ररूट: 'utf8' कोडक 57 में बाइट 0xe9 को डिकोड नहीं कर सकता है: अवैध निरंतरता बाइट
अरेलोविच

क्या आप utf-8 एनकोड के साथ बचत कर रहे हैं? देखो, यदि आप एक अन्य फ़ाइल से पढ़ रहे हैं जो कि एससीआई है, तो आपको इसे पहले डीकोड करना होगा।
फर्नांडो फ्रीटास

कोड जैसा आप देख रहे हैं। मैंने जो किया है उसे लेखक = कोडेक (ओपन) (आउटपुट, 'डब्ल्यू') के साथ लेखक = कोडेक्सोपेन (आउटपुट, 'डब्ल्यू', 'यूटीएफ -8') के साथ बदल दिया गया है और मुझे वह त्रुटि मिली है
अरेलोविच
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.