2014-02-07 3 views
1

я хочу, чтобы прочитать файл, найти что-то в нем и сохранить результат, но когда я хочу сохранить это дает мне ошибку
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 19: ordinal not in range(128)UnicodeDecodeError: сохранить файл в Python

код для сохранения в файл:
fileout.write((key + ';' + nameDict[key]+ ';'+src + alt +'\n').decode('utf-8'))

Что я могу сделать, чтобы исправить это?

+2

Это Python 2? Почему вы * расшифровываете * от UTF-8 до unicode? Что такое 'fileout' точно? Что в ваших переменных? –

+0

Это python 2, а в переменных - теги img, обработанные BeautifulSoup. – Allda

+0

Итак, 'key',' nameDict [key] ',' src' и 'alt' являются ** всеми ** значениями из BeautifulSoup? Тогда эти значения являются unicode. –

ответ

0

Вы пытаетесь объединить значения unicode с байтовыми строками, а затем преобразовать результат в unicode, чтобы записать его в файл-объект, который, скорее всего, принимает только байтовые строки.

Не смешивайте строки Unicode и байтовые строки.

Открыть файл для записи с io.open() для автоматизации кодирующей юникоды, а затем обрабатывать только Юникода в вашем коде:

import io 

with io.open(filename, 'w', encoding='utf8') as fileout: 
    # code gathering stuff from BeautifulSoup 

    fileout.write(u'{};{};{}{}\n'.format(key, nameDict[key], src, alt) 

Вы можете проверить csv module обрабатывать выписывая разделитель разделенного значения. Если идти по этому пути, вы должны явно кодировать столбцы:

import csv 

with open(filename, 'wb') as fileout: 
    writer = csv.writer(fileout, delimiter=';') 
    # code gathering stuff from BeautifulSoup 

    row = [key, nameDict[key], src + alt] 
    writer.writerow([c.encode('utf8') for c in row]) 

Если некоторые из этих данных поступает из других файлов, убедитесь, что вы также расшифровывает в Unicode в первую очередь; снова, io.open(), чтобы прочитать эти файлы, вероятно, лучший вариант, чтобы данные были декодированы для значений Unicode для вас во время чтения.