2013-09-04 7 views
0

Я получаю эту ошибку при записи в файл. Как я могу справиться с этим.UnicodeDecodeError: при записи в файл

Traceback (most recent call last): 
    File "C:\Python27\AureusBAXProjectFB.py", line 278, in <module> 
    rows = [[unicode(x) for x in row] for row in outlist] 
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe0 in position 0: ordinal not in range(128) 
>>> 

код для записи в файл

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) 

with open('C:/Users/Desktop/fboutput.csv', 'wb') as f: 
    writer = UnicodeWriter(f) 
    rows = [[unicode(x) for x in row] for row in outlist] 
    writer.writerows(rows) 

Я использую BeautifulSoup для разбора HTML данных и то работает нормально. Я получаю сообщение об ошибке только при записи в файл.

+0

Строки в 'outlist' еще не должны быть Unicode, но с помощью' unicode (x) ', чтобы превратить их в Unicode, используется кодек' ascii' по умолчанию, который поддерживает только ордера символов 0-127. Покажите код, заполняющий «outlist». –

ответ

0

Конструктор unicode(), определенный как unicode(string[, encoding, errors]), и по умолчанию используется кодировка ascii. Если многобайтная строка находится в списке, вы должны назначить кодировку unicode, такую ​​как utf-8.