2012-04-11 3 views
1

Я пытаюсь проанализировать серию паролей для частоты. Мой скрипт работает с другими носителями ввода, однако кажется, что в моем текущем наборе данных есть некоторые плохие символы. Как я могу обойти «плохие» данные?Ошибка обработки строки: UnicodeDecodeError: кодек 'utf8' не может декодировать

import re 
import collections 
words = re.findall('\w+', open('rockyou.txt').read().lower()) 
a=collections.Counter(words).most_common(50) 
for word in a: 
    print(word) 

Затем я получаю ошибку:

Traceback (most recent call last): 
    File "shakecount.py", line 3, in <module> 
    words = re.findall('\w+', open('rockyou.txt').read().lower().ASCII) 
    File "/Library/Frameworks/Python.framework/Versions/3.2/lib/python3.2/codecs.py", line 300, in decode 
    (result, consumed) = self._buffer_decode(data, self.errors, final) 
UnicodeDecodeError: 'utf8' codec can't decode byte 0xf1 in position 5079963: invalid continuation byte 

Есть идеи?

ответ

5

Ваш код точно не соответствует вашей ошибке (я предполагаю, что попытка отладки?), Но ваш текстовый файл не является UTF-8.

Вам необходимо вручную указать кодировку, с моей догадкой быть latin-1:

words = re.findall('\w+', open('rockyou.txt', encoding='latin-1').read().lower()) 

, если вы хотите продолжать, несмотря на ошибки, вы можете передать errors='ignore' или errors='replace' к open.

+0

Вышеприведенное было полезно, но в конечном итоге не решило проблему, я столкнулся с более греческими ошибками (я новичок в программировании). Я закончил тем, что открыл список слов в текстовом редакторе и перепечатал его в формате utf-8, который затем работал. Благодаря agf за вашу помощь! – AlphaTested

+0

@AlphaTested Если вы не знаете кодировку, другой способ - использовать [chardet] (http://pypi.python.org/pypi/chardet), чтобы обнаружить это. – agf

+0

А, я вижу. Благодарю. – AlphaTested

Смежные вопросы