Найти - Пользователи
Полная версия: Помогите разобраться с ошибкой UnicodeDecodeError
Начало » Python для новичков » Помогите разобраться с ошибкой UnicodeDecodeError
1
Voland
Помогите разобраться с ошибкой UnicodeDecodeError: ‘ascii’ codec can't decode byte 0xd0 in position 0: ordinal not in range(128).
Возникает она в строке ‘ticks’: )) for i, l in enumerate(items_list)]
Файл с латиницей проходит на ура (оно и понятно), а вот с русским косяк :(
Код скрипта:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Autor: Alexander P Telenga
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
# MA 02110-1301, USA.

import anydbm, cairo, codecs, re, pycha.bar, string, sys

global ru_pattern, en_pattern

ru_pattern = ur"[а-я]+"
en_pattern = ur"[a-z]+"

def analysis():
# получаем имя файла для составления словаря частот из первого аргумента командной строки
textfile = sys.argv[1]
# открываем файл в кодировке utf-8
a = codecs.open(textfile,"r","utf-8")
# получаем список слов текста в нижнем регистре
ru_words = re.findall(ru_pattern, a.read().lower(),re.UNICODE)
a.close()
# проделываем то же самое для латиницы
a = codecs.open(textfile,"r","utf-8")
en_words = re.findall(en_pattern, a.read().lower(),re.UNICODE)
a.close()
# создаем словарь
dic = {}
# наполняем словарь, используя метод get
# кириллица
for word in ru_words:
get = dic.get
dic[word] = get(word.lower(), 0) + 1
# латиница
for word in en_words:
get = dic.get
dic[word] = get(word.lower(), 0) + 1
# создаем пары вида "слово:частота"
pairs = dic.items()
#сортируем по убыванию частоты
pairs.sort(lambda a, b: b[1]-a[1])
# выводим результаты на печать и сохраняем их в файл
outfile = open("result.txt","w+")
for p in pairs:
string = p[0].encode('utf-8') + ':' + str(p[1]).encode('utf-8')
outfile.write(string+'\n')
outfile.close()
# создаем файл базы данных
outfile = anydbm.open("result.dat","n")
for p in pairs:
outfile[p[0].encode('utf-8')] = str(p[1]).encode('utf-8')
outfile.close()

def draw_result_pycha():
width = 0
height = 0
tmp = []
items_list = []
# открываем файл с результатами
result_file = anydbm.open("result.dat","r")
# читаем список элементов
for i in result_file.items():
items_list.append(i)
result_file.close
# вычисляем количество элементов и максимальное значение частоты слова
for l in items_list:
tmp.append(int(l[1]))
width = max(tmp)*100
height = len(items_list)*10
# создаем поверхность cairo для диаграммы
surface = cairo.ImageSurface(cairo.FORMAT_ARGB32, width, height)
# задаем диапазон значений для диаграммы
dataSet = (('Words', [(i, int(l[1])) for i, l in enumerate(items_list)]),)
options = {
'axis': {
'x': {
'ticks': [dict(v=i, label=unicode(l[0])) for i, l in enumerate(items_list)],
'label': u'Частота',
'rotate': 0,
},
'y': {
'tickCount': len(items_list)/10,
'rotate': 0,
'label': u'Слова'
}
},
'background': {
'chartColor': '#d8e7ec',
'baseColor': '#efebe7',
'lineColor': '#444444'
},
'colorScheme': '#6eafc1',
'padding': {
'left': 135,
'bottom': 55,
},
'title': u'Контент-анализ'
}
# выбираем горизонтальный тип диаграммы
chart = pycha.bar.HorizontalBarChart(surface, options)
# добавляем данные
chart.addDataset(dataSet)
chart.render()

surface.write_to_png("result_pycha.png")

def main():
analysis()
draw_result_pycha()

if __name__ == "__main__":
main()
kostyasa
лично я так и не смог решить эту проблему, ибо все связано с кодировками с тем, где мы их открываем, если питон запускаем в idle то это одно, если в консоли это другое, если система винда, то третье, если винда еще русской локализации то четвертое…. вобщем для полного счастья как я понял нужна своя таблица кодировок или, что более реально, подключится через api к майкрософт ворду и использовать его возможности, или опен офис
ZAN
Могу посоветовать проблему решить следующим образо:
1. Отделить ввод/вывод от логики програмы
2. Не преобразовывать кодировки внутри самой программы, а только на вводе/выводе. Т.е. внутри ее будет всегда использоваться какая-то одна кодировка - UTF8, например, или вообще юникод строки.
3. Проверить, что и в какой кодировке выдает чтение/запись в файл/базу.
Собственно, третий пункт для баги будет последним =)
Dimka665
string.encode(“codec”, “backslashreplace”)
Voland
Dimka665
Те же Фаберже, только в профиль.
Positive
'ticks': [dict(v=i, label=unicode(l[0]), 'utf8') for i, l in enumerate(items_list)],
Вместо utf8 подставьте кодировку своего текста.
Voland
Positive
Спасибо большое за подсказку!!!
Рабочий код выглядит так:
'ticks': [dict(v=i, label=unicode(l[0], 'utf-8')) for i, l in enumerate(items_list)],
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB