2013-04-01 3 views
1

Это действительно запутанно обрабатывать не-ascii код char в python. Может ли кто-нибудь объяснить?дескриптор строки без ascii в python

Я пытаюсь прочитать простой текстовый файл и заменить все неалфавитные символы пробелами.

У меня есть список символов:

ignorelist = ('!', '-', '_', '(', ')', ',', '.', ':', ';', '"', '\'', '?', '#', '@', '$', '^', '&', '*', '+', '=', '{', '}', '[', ']', '\\', '|', '<', '>', '/', u'—') 

для каждого маркера я получил, я заменить любой символ в этом знак с пространством, вызвав

for punc in ignorelist: 
     token = token.replace(punc, ' ') 

уведомление есть не ASCII код символа в конец ignorelist: u'—'

Каждый раз, когда мой код встречает этот персонаж, он падает и говорит:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 

Я попытался объявить кодировку, добавив # -*- coding: utf-8 -*- в начало файла, но все еще не работает. кто знает почему? Благодаря!

ответ

2

Вы используете Python 2.x, и он попытается автоконвертировать unicode s и обычный str s, но он часто терпит неудачу с символами, отличными от ascii.

Вы не должны смешивать unicode с и str вместе. Вы можете придерживаться unicode с:

ignorelist = (u'!', u'-', u'_', u'(', u')', u',', u'.', u':', u';', u'"', u'\'', u'?', u'#', u'@', u'$', u'^', u'&', u'*', u'+', u'=', u'{', u'}', u'[', u']', u'\\', u'|', u'<', u'>', u'/', u'—') 

if not isinstance(token, unicode): 
    token = token.decode('utf-8') # assumes you are using UTF-8 
for punc in ignorelist: 
    token = token.replace(punc, u' ') 

или использовать только обычный str с (заметьте последний):

ignorelist = ('!', '-', '_', '(', ')', ',', '.', ':', ';', '"', '\'', '?', '#', '@', '$', '^', '&', '*', '+', '=', '{', '}', '[', ']', '\\', '|', '<', '>', '/', u'—'.encode('utf-8')) 
# and other parts do not need to change 

Вручную процесс кодирования u'—' в str, Python не нужно попробуй это сам.

Я предлагаю вам использовать unicode всю вашу программу, чтобы избежать подобных ошибок. Но если это будет слишком много, вы можете использовать последний метод. Однако будьте осторожны, когда вы вызываете некоторые функции в стандартной библиотеке или сторонних модулях.

# -*- coding: utf-8 -*- только сообщает Python, что ваш код написан в UTF-8 (или вы получите SyntaxError).

4

Ваш входной файл не является utf-8. Поэтому, когда вы нажимаете на этот символ юникода, ваш входной бафф по сравнению, потому что он рассматривает ваш вход как ascii.

Попробуйте вместо этого прочитать файл.

import codecs 
f = codecs.open("test", "r", "utf-8") 
+0

Спасибо, что работает! – bolei

+0

Я бы хотел вас поддержать. но мой счет меньше 15, и я не могу голосовать ... извините за это! – bolei