2015-03-05 5 views
6

में नहीं, मैं python2.7 में एक फ़ाइल पढ़ने की कोशिश कर रहा था, और इसे पूरी तरह से पढ़ा गया था। समस्या मेरे पास है वह यह है कि जब मैं Python3.4 में एक ही कार्यक्रम पर अमल और उसके बाद त्रुटि दिखाई:'utf-8' कोडेक Python3.4 में एक फ़ाइल को बाइट डीकोड नहीं कर सकता है लेकिन Python2.7

'utf-8' codec can't decode byte 0xf2 in position 424: invalid continuation byte' 

इसके अलावा, जब मैं Windows (python3.4 के साथ) में कार्यक्रम चलाने के लिए, त्रुटि नहीं है दिखाई देते हैं। दस्तावेज़ की पहली पंक्ति है: Codi;Codi_lloc_anonim;Nom

और मेरे कार्यक्रम का कोड है:

def lectdict(filename,colkey,colvalue): 
    f = open(filename,'r') 
    D = dict() 

    for line in f: 
     if line == '\n': continue 
     D[line.split(';')[colkey]] = D.get(line.split(';')[colkey],[]) + [line.split(';')[colvalue]] 

f.close 
return D 

Traduccio = lectdict('Noms_departaments_centres.txt',1,2) 
+0

आपकी टेक्स्ट फ़ाइल में गैर-ASCII सामग्री और एन्कोडिंग क्या है? –

+1

ऐसा लगता है कि पायथन मानता है कि फ़ाइल utf-8 है लेकिन यह वास्तव में सच नहीं है, क्या आप खोलने की कोशिश कर सकते हैं (फ़ाइल नाम, 'आर', एन्कोडिंग = 'लैटिन -1') शायद? – user3012759

उत्तर

11

को Python2 में,

f = open(filename,'r') 
for line in f: 

बाइट्स के रूप में फ़ाइल से लाइनों पढ़ता है।

पायथन 3 में, एक ही कोड फ़ाइल से लाइनों को के रूप में पढ़ता है। पायथन 3 स्ट्रिंग्स हैं जो Python2 कॉल unicode ऑब्जेक्ट्स हैं। कुछ एन्कोडिंग के अनुसार ये बाइट्स डीकोड किए गए हैं। पायथन 3 में डिफ़ॉल्ट एन्कोडिंग utf-8 है।

त्रुटि संदेश

'utf-8' codec can't decode byte 0xf2 in position 424: invalid continuation byte' 

से पता चलता python3 utf-8 के रूप में बाइट्स डिकोड करने के लिए कोशिश कर रहा है। चूंकि कोई त्रुटि है, फ़ाइल में utf-8 एन्कोडेड बाइट शामिल नहीं है।

समस्या आप करने की जरूरत है फ़ाइल का सही एन्कोडिंग निर्दिष्ट ठीक करने के लिए:

with open(filename, encoding=enc) as f: 
    for line in f: 

आप सही एन्कोडिंग पता नहीं है, तो आप इस कार्यक्रम बस सभी ज्ञात एनकोडिंग कोशिश करने के लिए चला सकते हैं पायथन के लिए। यदि आप भाग्यशाली हैं तो एन्कोडिंग होगा जो बाइट्स को पहचानने योग्य पात्रों में बदल देता है। कभी-कभी एक एन्कोडिंग की तुलना में काम करने के लिए दिखाई दे सकता है, इस स्थिति में आपको जांच करने की आवश्यकता होगी और परिणामों की सावधानी से तुलना करें।

# Python3 
import pkgutil 
import os 
import encodings 

def all_encodings(): 
    modnames = set(
     [modname for importer, modname, ispkg in pkgutil.walk_packages(
      path=[os.path.dirname(encodings.__file__)], prefix='')]) 
    aliases = set(encodings.aliases.aliases.values()) 
    return modnames.union(aliases) 

filename = '/tmp/test' 
encodings = all_encodings() 
for enc in encodings: 
    try: 
     with open(filename, encoding=enc) as f: 
      # print the encoding and the first 500 characters 
      print(enc, f.read(500)) 
    except Exception: 
     pass 
+0

शायद https://cdn.rawgit.com/tripleee/8bit/master/encodings.html#f2 आपको सही एन्कोडिंग की खोज को कम करने में मदद कर सकता है। परीक्षण और त्रुटि दृष्टिकोण वास्तव में व्यवहार्य नहीं है यदि आप नहीं जानते कि बाइट्स का प्रतिनिधित्व करने के लिए क्या माना जाता है - यादृच्छिक 8-बिट एन्कोडिंग में एक यादृच्छिक स्ट्रिंग मान्य है लेकिन अन्य 8-बिट एन्कोडिंग में और भी यादृच्छिक स्ट्रिंग है । – tripleee

+1

@ ट्रिपली क्योंकि यह विंडोज़ में काम करता है, मुझे यकीन है कि इसकी सीपी 1250 है क्योंकि यह डिफ़ॉल्ट नहीं होगा? – user3012759

+2

"वहां" के मानों के लिए जहां यह डिफ़ॉल्ट है, ठीक है, हाँ; लेकिन सार्वभौमिक रूप से नहीं। डिफ़ॉल्ट कोड पृष्ठ इस बात पर निर्भर करता है कि सिस्टम को पहले स्थान पर कैसे स्थापित किया गया था। लेकिन अगर आप जानते हैं कि स्रोत एक नियमित यूएस या विंडोज़ का यूरोपीय यूरोपीय स्थापित है, तो मुझे विश्वास है [सीपी 1252] (http://en.wikipedia.org/wiki/Windows-1252) अपेक्षित डिफ़ॉल्ट होगा। यह [सीपी 1250] से अलग है (http://en.wikipedia.org/wiki/Windows-1250) जो पूर्वी यूरोपीय भाषाओं के लिए है। – tripleee

0

ठीक है, मैं @unutbu के रूप में मुझे बता भी ऐसा ही किया। नतीजा यह था कि इनमें से एक एन्कोडिंग सीपी 1250 है, इस कारण से मैं एफ = ओपन (फ़ाइल नाम, 'आर') एफ = ओपन (फ़ाइल नाम, 'आर', एन्कोडिंग = 'सीपी 1250') के लिए बदलता हूं जैसे @ ट्रिपली मुझे सुझाव देते हैं। और अब मैं अपनी फाइलें पढ़ सकता हूं।

संबंधित मुद्दे

 संबंधित मुद्दे