Python - 解码列表中的utf-8列表(解码整个列表对象)

时间:2016-04-30 11:29:18

标签: python utf-8 decode encode

假设我有一个列表,其中包含多个列表,例如:

l = [['a'],['a','b'],['c'],['d',['a','b'],'f']]

用这个:

l = [x.decode('UTF8') for x in l]

可能我会收到错误:列表对象没有属性' decode'

(" l"从标记化文本创建的列表,其每个单词都成为列表对象。尝试了许多解决方案以克服解码难度,但仍然无法打印非ascii字符)

with open(path, "r") as myfile:
    text=myfile.read()

text = word_tokenize(text)

d = [[item] if not isinstance(item, list) else item for item in text]

arr = sum(([[x[0] for x in g]] if k else list(g)
     for k, g in groupby(d, key=lambda x: x[0][0].isupper())),
    [])

arr = [x.decode('UTF8') for x in arr]

INPUT(我的文字档案):

Çanakkale çok güzel bir şehirdir. Çok beğendik.

输出:

[[u'\xc7anakkale'], [u'\xe7ok'], [u'g\xfczel'], [u'bir'], [u'\u015fehirdir'], [u'.']. [u'\xe7ok'], [u'be\u011fendik'], [u'.']]

我想要的输出是列表,但与输入格式完全一样。

2 个答案:

答案 0 :(得分:3)

您可以使用简单的递归函数进行解码:

l1 = [['a'],['a','b'],['c'],['d',['a','b'],'f']]

def decode(l):
    if isinstance(l, list):
        return [decode(x) for x in l]
    else:
        return l.decode('utf-8')

decode(l1) # [[u'a'], [u'a', u'b'], [u'c'], [u'd', [u'a', u'b'], u'f']]

答案 1 :(得分:2)

首先,您认为您遇到的问题是您正在打印整个列表(您没有在问题中包含该部分,所以我不得不猜测) - Python正在打印安全的表示< / strong>的数据。对你而言,这意味着它表明你有Unicode字符串(因此是u''),它显示了非ASCII字符的Unicode点十六进制值。

如果您要打印列表中的单个部分,那么您将得到您所期望的。

>>> print arr[0][0]
Çanakkale

如果要打印所有值,则需要for循环:

for x in arr:
    for y in x:
        print y

您还通过手动解码代码中的数据来引入不必要的复杂性 - 而不是您应该在输入时解码数据。

您似乎正在使用Python 2.x(由前缀'表示),因此在阅读时使用io模块解码文本数据:

import io
with io.open(path, "r", encoding="utf-8") as myfile:
    text=myfile.read()

现在您可以删除arr = [x.decode('UTF8') for x in arr]行。