Python: 使用CJKLIB将汉字转换为拼音
我正在尝试把一堆汉字转换成拼音,汉字是从一个文件里读取的,而拼音则写入另一个文件。我正在使用CJKLIB的函数来完成这个任务。
这是我的代码,
from cjklib.characterlookup import CharacterLookup
source_file = 'cities_test.txt'
dest_file = 'output.txt'
s = open(source_file, 'r')
d = open(dest_file, 'w')
cjk = CharacterLookup('T')
for line in s:
p = line.split('\t')
for p_shard in p:
for c in p_shard:
readings = cjk.getReadingForCharacter(c.encode('utf-8'), 'Pinyin')
d.write(readings[0].encode('utf-8'))
d.write('\t')
d.write('\n')
s.close()
d.close()
我的问题是我一直遇到和Unicode相关的错误,这个错误在我调用getReadingForCharacter
函数时出现。如果我按原样调用它,
readings = cjk.getReadingForCharacter(c.encode('utf-8'), 'Pinyin')
我会得到:UnicodeDecodeError: 'ascii' codec can't decode byte 0xef in position 0: ordinal not in range (128)。
如果我这样调用,不加.encoding()
,
readings = cjk.getReadingForCharacter(c, 'Pinyin')
我会收到一个来自sqlalchemy的错误(CJKLIB使用了sqlalchemy和sqlite):你不能使用8位字节字符串,除非你使用一个可以解释8位字节字符串的text_factory……等等。
有人能帮我解决这个问题吗?谢谢!
哦,还有,CJKLIB有没有办法返回没有声调的拼音?我觉得默认情况下它返回的拼音带有一些奇怪的字符来表示声调,我只想要没有这些声调的字母。
1 个回答
你的问题在于,你没有对输入流进行解码,但却又把它当作UTF-8格式重新编码。这是错误的做法。
你有两个选择。
第一种选择是用codecs.open
来打开输入文件,并明确指定编码方式。这样每次读取文件时,你都会得到正常的Unicode字符串,因为解码是自动进行的。我个人非常推荐这种方法。现在已经没有所谓的文本文件了。
第二种选择是,在把数据传给函数之前,手动解码你的二进制字符串。我不喜欢这种做法,因为这几乎总是意味着你在做错事,即使不是,这种方式也非常笨拙。
对于输出文件,我也会采取同样的做法。我真的不喜欢到处看到手动使用.encode("utf-8")
和.decode("utf-8")
。设置好流的编码就可以了,别再纠结了。