अजगर 2.7 से यूनिकोड पाठ लोड करने के लिए सही तरीका है कुछ की तरह:पायथन 2.7 में एक समय में यूनिकोड एक पंक्ति को कैसे डीकोड कर सकता हूं? ,</p> <p>लेकिन अगर फ़ाइल बहुत है
content = open('filename').read().decode('encoding'):
for line in content.splitlines():
process(line)
(कोई यह नहीं है उत्तर देखें अद्यतन।।) बड़ा, मैं इसे एक समय में एक पंक्ति को पढ़ना, डीकोड और संसाधित करना चाहता हूं, ताकि पूरी फ़ाइल को एक बार में स्मृति में कभी लोड नहीं किया जा सके। कुछ की तरह:
for line in open('filename'):
process(line.decode('encoding'))
खुला filehandle से अधिक for
पाश की यात्रा एक जनरेटर है कि एक समय में एक लाइन पढ़ता है।
क्योंकि अगर फ़ाइल utf32 एन्कोड किया गया है, उदाहरण के लिए, तो फ़ाइल में बाइट्स (हेक्स में) कुछ इस तरह दिखाई यह, हालांकि काम नहीं करता:
hello\n = 68000000(h) 65000000(e) 6c000000(l) 6c000000(l) 6f000000(o) 0a000000(\n)
और के द्वारा किया लाइनों में विभाजित for
पाश \n
चरित्र की 0a
बाइट पर विभाजित करता है, में (हेक्स में) जिसके परिणामस्वरूप:
lines[0] = 0x 68000000 65000000 6c000000 6c000000 6f000000 0a
lines[1] = 0x 000000
तो \n
चरित्र का हिस्सा लाइन 1 के अंत में छोड़ दिया जाता है और शेष तीन बाइट्स में समाप्त लाइन 2 (इसके बाद जो भी पाठ वास्तव में लाइन 2 में है।) इन पंक्तियों में से किसी एक पर decode
पर कॉल करने से UnicodeDecodeError
में परिणाम मिलता है।
UnicodeDecodeError: 'utf32' codec can't decode byte 0x0a in position 24: truncated data
तो, जाहिर है काफी, 0a
बाइट्स पर एक यूनिकोड बाइट धारा बंटवारे नहीं यह लाइनों में विभाजित करने के लिए सही तरीका है। इसके बजाय मुझे पूर्ण चार-बाइट न्यूलाइन कैरेक्टर (0x0a000000) की घटनाओं पर विभाजित होना चाहिए। हालांकि, मुझे लगता है कि इन वर्णों का पता लगाने का सही तरीका बाइट स्ट्रीम को यूनिकोड स्ट्रिंग में डीकोड करना है और \n
वर्णों को ढूंढना है - और पूर्ण स्ट्रीम का यह डिकोडिंग बिल्कुल ऑपरेशन है जिसे मैं टालने का प्रयास कर रहा हूं।
यह असामान्य आवश्यकता नहीं हो सकती है। इसे संभालने का सही तरीका क्या है?
क्या आपने codecs.open() विधि का उपयोग कर फ़ाइल पढ़ने का प्रयास किया था? –
@ मौलवर्फन, मुझे नहीं पता था कि यह अस्तित्व में था! लेकिन अब मैं करता हूँ। धन्यवाद। –