如何解码中文文本中的unicode

新手上路,请多包涵
with open('result.txt', 'r') as f:
data = f.read()

print 'What type is my data:'
print type(data)

for i in data:
    print "what is i:"
    print i
    print "what type is i"
    print type(i)

    print i.encode('utf-8')

我有带字符串的文件,我正在尝试读取文件并按空格拆分单词并将它们保存到列表中。下面是我的代码:

以下是我的错误信息: 在此处输入图像描述

有人请帮忙!

更新:

我将在这里详细描述我正在尝试做的事情,以便为人们提供更多背景信息:我正在尝试做的目标是:1. 将中文文本分解成句子,并检测基本的结尾标点符号。 2. 取每个句子,使用工具jieba将字符分词成有意义的词。例如,两个汉字“学,生”将组合在一起产生一个标记“学生”(意思是学生)。 3. 将句子中的所有标记保存到列表中。因此最终列表将包含多个列表,因为一个段落中有多个句子。

 # coding: utf-8
#encoding=utf-8

import jieba

cutlist = "。!?".decode('utf-8')
test = "【明報專訊】「吉野家」and Peter from US因被誤傳採用日本福島米而要報警澄清,並自爆用內地黑龍江米,日本料理食材來源惹關注。本報以顧客身分向6間日式食店查詢白米產地,其中出售逾200元日式豬扒飯套餐的「勝博殿日式炸豬排」也選用中國大連米,誤以為該店用日本米的食客稱「要諗吓會否再幫襯」,亦有食客稱「好食就得」;壽司店「板長」店員稱採用香港米,公關其後澄清來源地是澳洲,即與平價壽司店「爭鮮」一樣。有飲食界人士稱,雖然日本米較貴、品質較佳,但內地米品質亦有保證。"

#FindToken check whether the character has the ending punctuation
def FindToken(cutlist, char):
    if char in cutlist:
        return True
    else:
        return False

”’

cut 检查字符串列表中的每个项目,如果该项目不是结束标点符号,它将把它保存到一个名为 line 的临时列表中。当遇到结束标点时,它会将已收集在列表行中的完整句子保存到最终列表中。 “’

 def cut(cutlist,test):
    l = []
    line = []
    final = []

”’

检查字符串列表中的每个项目,如果该项目不是结尾的标点符号,它将把它保存到一个名为 line 的临时列表中。当遇到结束标点时,它会将列表行中收集的完整句子保存到最终列表中。 “’

     for i in test:
        if i == ' ':
            line.append(i)

        elif FindToken(cutlist,i):
            line.append(i)
            l.append(''.join(line))
            line = []
        else:
            line.append(i)

    temp = []
    #This part iterate each complete sentence and then group characters according to its context.
    for i in l:
        #This is the function that break down a sentence of characters and group them into phrases
        process = list(jieba.cut(i, cut_all=False))

        #This is puting all the tokenized character phrases of a sentence into a list. Each sentence
        #belong to one list.
        for j in process:
            temp.append(j.encode('utf-8'))
            #temp.append(j)
        print temp

        final.append(temp)
        temp = []
    return final

cut(list(cutlist),list(test.decode('utf-8')))

这是我的问题,当我输出最终列表时,它给了我以下结果的列表:

 [u'\u3010', u'\u660e\u5831', u'\u5c08\u8a0a', u'\u3011', u'\u300c', u'\u5409\u91ce\u5bb6', u'\u300d', u'and', u' ', u'Peter', u' ', u'from', u' ', u'US', u'\u56e0', u'\u88ab', u'\u8aa4\u50b3', u'\u63a1\u7528', u'\u65e5\u672c', u'\u798f\u5cf6', u'\u7c73', u'\u800c', u'\u8981', u'\u5831\u8b66', u'\u6f84\u6e05', u'\uff0c', u'\u4e26', u'\u81ea\u7206', u'\u7528\u5167', u'\u5730', u'\u9ed1\u9f8d', u'\u6c5f\u7c73', u'\uff0c', u'\u65e5\u672c\u6599\u7406', u'\u98df\u6750', u'\u4f86\u6e90', u'\u60f9', u'\u95dc\u6ce8', u'\u3002']

如何将 unicode 列表转换为普通字符串?

原文由 YAL 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 460
1 个回答

让我给你一些提示:

  • 在尝试遍历单词 之前, 您需要将从 UTF-8 读取的字节解码为 Unicode。
  • 当你读取一个文件时,你不会得到 Unicode。你只会得到普通字节。 (我想你知道这一点,因为你已经在使用 decode() 。)
  • 有一个“按空间拆分”的标准函数,称为 split()
  • 当你说 for i in data 时,你是说你想遍历刚刚读取的文件的每个字节。循环的每次迭代都是一个字符。我不确定这是否是您想要的,因为这意味着您必须手动进行 UTF-8 解码(而不是使用 decode() ,它必须对整个 UTF-8 字符串进行操作。 ).

换句话说,这里有一行代码可以做到这一点:

 open('file.txt').read().decode('utf-8').split()

如果这是家庭作业,请不要上交。你的老师会找你的。 ;-)


编辑:这是一个如何在 python 中编码和解码 unicode 字符的示例:

 >>> data = u"わかりません"
>>> data
u'\u308f\u304b\u308a\u307e\u305b\u3093'
>>> data_you_would_see_in_a_file = data.encode('utf-8')
>>> data_you_would_see_in_a_file
'\xe3\x82\x8f\xe3\x81\x8b\xe3\x82\x8a\xe3\x81\xbe\xe3\x81\x9b\xe3\x82\x93'
>>> for each_unicode_character in data_you_would_see_in_a_file.decode('utf-8'):
...     print each_unicode_character
...
わ
か
り
ま
せ
ん

首先要注意的是 Python(嗯,至少 Python 2)在字符串常量上使用 u"" 表示法(注意 u 前缀)以表明它们是 Unicode。在 Python 3 中,字符串默认为 Unicode,但如果需要字节字符串,可以使用 b""

如您所见,Unicode 字符串由两个字节的字符组成。当你读取文件时,你会得到一个单字节字符的字符串(相当于你调用 .encode() 时得到的字符串。所以如果你有文件中的字节,你必须调用 .decode() 将它们转换回 Unicode。然后你可以遍历每个字符。

“按空格”拆分是每种语言所独有的,因为许多语言(例如中文和日语)不像大多数欧洲语言那样使用 ' ' 字符。我不知道如何在 Python 中做到这一点,但我确信有办法。

原文由 mpontillo 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题