翻译排除某些字符时的编码问题 (Python)

Encoding problems when certain characters are excluded with translate (Python)

我正在编写一个创建词频分布列表的脚本。 我使用翻译去除特殊字符。它工作得很好,即使使用符号作为法语引号 «»。但是,只要我将 添加到排除符号列表中,结果列表就会更改

等字词的显示

wie's:1

wie<99>s:1

源文档编码为utf-8。

这是我的代码的一个简短的工作示例:

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

inputfile = "articel.txt"
outputfile = "articel_dic.txt"
myoutput = open(outputfile, "w")
dic = {}
myinput = open(inputfile, "r").readlines()

for line in myinput:
    words = line.split()
    for word in words:
        word = word.translate(None, ",.?-;!:«»…")
        if word in dic:
            dic[word] += 1
        else:
            dic[word] = 1    

outtext = ""
for key in dic:
    outtext += key +":"+ str(dic[key]) +"\n"
s = outtext     
myoutput.write(s)

str.translate 可以破坏多字节字符,因为它不知道 UTF-8。具体来说,它将 deletechars 参数视为要单独删除的字节串。尝试删除 « 和 » 有同样的问题,但它影响不同的字符;你很幸运没有在你的文本中有任何这样的字符。

您必须使用 Unicode 工作:

mapping = {ord(x): None for x in u",.?-;!:«»…"}
word = word.decode("utf8").translate(mapping)

myoutput.write(s.encode("utf8"))