2011-07-21 6 views
16

किसी कारण से मैं अपनी utf16 फ़ाइल नहीं ढूंढ सकता। यह 'यूनिकोड अपवाद: यूटीएफ -16 स्ट्रीम बीओएम से शुरू नहीं होता है' का उत्पादन करता है। मेरा कोड:utf-16 फ़ाइल। कैसे?

f = codecs.open(ai_file, 'r', 'utf-16') 
seek = self.ai_map[self._cbClass.Text] #seek is valid int 
f.seek(seek) 
while True: 
    ln = f.readline().strip() 

मैंने यादृच्छिक सामान की कोशिश की जैसे पहले स्ट्रीम से कुछ पढ़ना, मदद नहीं की। मैंने ऑफ़सेट की जांच की है जो हेक्स संपादक का उपयोग करने की तलाश में है - स्ट्रिंग चरित्र पर शुरू होती है, नल बाइट नहीं (मुझे लगता है कि यह अच्छा संकेत है, है ना?) तो पायथन में utf-16 कैसे खोजें?

उत्तर

23

ठीक है, त्रुटि संदेश आपको बता रहा है क्यों: यह बाइट ऑर्डर चिह्न नहीं पढ़ रहा है। बाइट ऑर्डर मार्क फ़ाइल की शुरुआत में है। बाइट ऑर्डर मार्क पढ़ने के बिना, यूटीएफ -16 डीकोडर यह नहीं जान सकता कि बाइट्स किस क्रम में हैं। जाहिर है, यह पहली बार जब आप फ़ाइल खोलते हैं, तो यह आलसी हो जाता है - या फिर यह माना जाता है कि seek() एक नई यूटीएफ -16 धारा शुरू कर रहा है।

यदि आपकी फ़ाइल में कोई बीओएम नहीं है, तो यह निश्चित रूप से समस्या है और फ़ाइल खोलते समय आपको बाइट ऑर्डर निर्दिष्ट करना चाहिए (नीचे # 2 देखें)।

  1. फ़ाइल के पहले दो बाइट्स पढ़ें बीओएम प्राप्त करने के लिए इससे पहले कि आप की तलाश: अन्यथा, मैं दो संभावित समाधान देखने। आप यह दर्शाता है कि शायद यह तलाश के बाद एक ताजा UTF-16 धारा की उम्मीद कर रहा है कहने के लिए यह काम नहीं किया लगता है, है, तो: जब आप फ़ाइल को खोलने

  2. स्पष्ट रूप से बाइट क्रम निर्दिष्ट एन्कोडिंग के रूप में utf-16-le या utf-16-be का उपयोग करके ।

+0

दरअसल, धन्यवाद! – marrat

+1

thx utf-16-le/be के लिए एक गुच्छा। पहली बार काम किया – javadba