【问题标题】:Python - Decode utf-8 list in lists (decode entire list objects)Python - 解码列表中的 utf-8 列表(解码整个列表对象)
【发布时间】:2016-08-25 13:23:24
【问题描述】:

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

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

用这个:

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

我可能会得到错误:列表对象没有属性“解码”

(从标记化文本创建的“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]

输入(我的文本文件):

Ç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'.']]

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

【问题讨论】:

  • 你需要保留结构吗?
  • 我想我有很多非 ascii 字符,但我想用确切的结构打印它们(单词包含 ü ğ ş ı ç)
  • 请提供minimal reproducible example和设计输出

标签: python utf-8 decode encode


【解决方案1】:

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

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']]

【讨论】:

  • 谢谢。试过这个,但我是否以错误的方式提出问题?因为解码(urf-8)后我会得到包含的单词(ü ğ ş ı ç)
  • 如果您将有问题的输入和预期输出添加到问题本身会有所帮助。
  • 我很确定编码是utf-8 而不是UTF8
  • @Natecat 谢谢,相应地改变了答案
  • 当我尝试打印时,列表中的 l 仍然是非 ascii。我的目标也是比较我的数据库中的列表对象。我有一个位置集,Çanakkale 是位置,但如果我的词是 '\xc7anakkale',它将不匹配并且会给我错误
【解决方案2】:

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

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

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

如果你想打印所有的值,你需要一个 for 循环:

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

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

看来您使用的是 Python 2.x(以 u'' 为前缀),因此请在阅读文本数据时使用 io 模块对文本数据进行解码:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-02
    • 1970-01-01
    • 2015-08-06
    • 2017-03-15
    • 1970-01-01
    • 2023-03-10
    • 2018-07-28
    相关资源
    最近更新 更多