翻译排除某些字符时的编码问题 (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"))
我正在编写一个创建词频分布列表的脚本。 我使用翻译去除特殊字符。它工作得很好,即使使用符号作为法语引号 « 或 »。但是,只要我将 … 或 – 添加到排除符号列表中,结果列表就会更改
等字词的显示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"))