2012-08-09 7 views
28

मैंने इस स्क्रिप्ट को [पायथन वेब साइट] से कॉपी किया है [1] यह एक और सवाल है लेकिन अब एन्कोडिंग के साथ समस्या:पायथन सीएसवी यूनिकोड 'एएससीआई' कोडेक स्थिति में 'u' xx6 'को एन्कोड नहीं कर सकता है: क्रमशः श्रेणी में नहीं (128)

import sqlite3 
import csv 
import codecs 
import cStringIO 
import sys 

class UTF8Recoder: 
    """ 
    Iterator that reads an encoded stream and reencodes the input to UTF-8 
    """ 
    def __init__(self, f, encoding): 
     self.reader = codecs.getreader(encoding)(f) 

    def __iter__(self): 
     return self 

    def next(self): 
     return self.reader.next().encode("utf-8") 

class UnicodeReader: 
    """ 
    A CSV reader which will iterate over lines in the CSV file "f", 
    which is encoded in the given encoding. 
    """ 

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 
     f = UTF8Recoder(f, encoding) 
     self.reader = csv.reader(f, dialect=dialect, **kwds) 

    def next(self): 
     row = self.reader.next() 
     return [unicode(s, "utf-8") for s in row] 

    def __iter__(self): 
     return self 

class UnicodeWriter: 
    """ 
    A CSV writer which will write rows to CSV file "f", 
    which is encoded in the given encoding. 
    """ 

    def __init__(self, f, dialect=csv.excel, encoding="utf-8", **kwds): 
     # Redirect output to a queue 
     self.queue = cStringIO.StringIO() 
     self.writer = csv.writer(self.queue, dialect=dialect, **kwds) 
     self.stream = f 
     self.encoder = codecs.getincrementalencoder(encoding)() 

    def writerow(self, row): 
     self.writer.writerow([s.encode("utf-8") for s in row]) 
     # Fetch UTF-8 output from the queue ... 
     data = self.queue.getvalue() 
     data = data.decode("utf-8") 
     # ... and reencode it into the target encoding 
     data = self.encoder.encode(data) 
     # write to the target stream 
     self.stream.write(data) 
     # empty queue 
     self.queue.truncate(0) 

    def writerows(self, rows): 
     for row in rows: 
      self.writerow(row) 

एन्कोडिंग के साथ इस बार समस्या, जब मैं इस भाग गया यह मुझे इस त्रुटि दिया:

Traceback (most recent call last): 
    File "makeCSV.py", line 87, in <module> 
    uW.writerow(d) 
    File "makeCSV.py", line 54, in writerow 
    self.writer.writerow([s.encode("utf-8") for s in row]) 
AttributeError: 'int' object has no attribute 'encode' 

तो मैं स्ट्रिंग के लिए सभी पूर्णांकों परिवर्तित, लेकिन इस बार मैं यह त्रुटि आई :

Traceback (most recent call last): 
    File "makeCSV.py", line 87, in <module> 
    uW.writerow(d) 
    File "makeCSV.py", line 54, in writerow 
    self.writer.writerow([str(s).encode("utf-8") for s in row]) 
UnicodeEncodeError: 'ascii' codec can't encode character u'\xf6' in position 1: ordinal not in range(128) 

मैंने यूनिकोड वर्णों से निपटने के लिए ऊपर लागू किया है, लेकिन यह मुझे ऐसी त्रुटि देता है। समस्या क्या है और इसे कैसे ठीक किया जाए?

उत्तर

64

Then I converted all integers to string,

आप बाइट तार करने के लिए दोनों पूर्णांकों और तार बदल दिया। तारों के लिए यह डिफ़ॉल्ट वर्ण एन्कोडिंग का उपयोग करेगा जो ASCII होता है, और जब आपके पास गैर-ASCII वर्ण होते हैं तो यह विफल हो जाता है। आप str के बजाय unicode चाहते हैं।

self.writer.writerow([unicode(s).encode("utf-8") for s in row]) 

यह विधि कॉल करने से पहले सब कुछ यूनिकोड में परिवर्तित करना बेहतर हो सकता है। कक्षा विशेष रूप से यूनिकोड तारों को पार्स करने के लिए डिज़ाइन की गई है। यह अन्य डेटा प्रकारों का समर्थन करने के लिए डिज़ाइन नहीं किया गया था।

Unlike the StringIO module, this module is not able to accept Unicode strings that cannot be encoded as plain ASCII strings.

यानी:

2
प्रलेखन से

केवल 7-बिट साफ तारों को संग्रहीत किया जा सकता है।