Python 编码问题

4 投票
3 回答
5844 浏览
提问于 2025-04-17 00:22

我最近在研究Python的编码问题,虽然可能了解得不够,但我已经花了两天时间在这上面,还是遇到了一些麻烦。我会尽量把事情说得清楚一些。主要的问题是,我想去掉所有的重音符号和一些特殊字符,比如#、!、%、&等等。

我在使用Twitter的搜索API时,发起了一个查询请求,代码如下:

query = urllib2.urlopen(settings.SEARCH_URL + '?%s' % params)

然后,我调用了一个方法(avaliar_pesquisa()),用来根据输入的标签(或关键词)来评估我得到的结果:

dados = avaliar_pesquisa(simplejson.loads(query.read()), str(tags))

avaliar_pesquisa()方法中,发生了以下事情:

def avaliar_pesquisa(dados, tags):
    resultados = []
    # Percorre os resultados
    for i in dados['results']
        resultados.append({'texto'          : i['text'],
                           'imagem'         : i['profile_image_url'],
                           'classificacao'  : avaliar_texto(i['text'], tags),
                           'timestamp'      : i['created_at'],
                         })

注意到有个avaliar_texto()方法,它用来评估推文的文本。而问题正出现在接下来的几行代码中:

def avaliar_texto(texto, tags):
    # Remove accents
    from unicodedata import normalize
    def strip_accents(txt):
        return normalize('NFKD', txt.decode('utf-8'))

    # Split
    texto_split = strip_accents(texto)
    texto_split = texto.lower().split()

    # Remove non-alpha characters
    import re
    pattern = re.compile('[\W_]+')
    texto_aux = []
    for i in texto_split:
        texto_aux.append(pattern.sub('', i))
    texto_split = texto_aux

这里的分割其实没什么关系。关键是,如果我在这个最后的方法中打印变量texto的类型,可能会得到str或unicode作为结果。如果文本中有任何重音符号,它就会以unicode的形式出现。所以,当我运行这个最多能接收100条推文的应用时,就会出现以下错误:

UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 17: ordinal not in range(128)

对于以下文本:

文本:Agora o problema é com o speedy. 类型 'unicode'

有没有什么想法?

3 个回答

1

在你的Python脚本开头放上:

# -*- coding: utf-8 -*-

这段代码应该放在包含你代码的Python脚本的最前面。

9

请查看这个页面

decode()这个方法是用在字符串对象上的,而不是用在unicode对象上。如果你给它一个unicode字符串,它会先尝试用ascii编码把它转成字符串,然后再用utf-8解码,这样就会出错。

你可以试试 return normalize('NFKD', unicode(txt) )

5

这是我在代码中用来去掉重音符号等的办法。

text = unicodedata.normalize('NFD', text).encode('ascii','ignore')

撰写回答