Python:使用CJKLIB将中文字符转换为拼音

时间:2011-08-28 15:10:46

标签: python unicode cjk

我正在尝试将一堆汉字转换为拼音,从一个文件中读取字符并将拼音写入另一个文件。我正在使用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'编解码器无法解码位置0的字节0xef:序号不在范围内(128)。

如果我这样称呼它,没有.encoding()

readings = cjk.getReadingForCharacter(c, 'Pinyin')

我收到sqlalchemy抛出的错误(CJKLIB使用sqlalchemy和sqlite):除非使用可以解释8位字节串的text_factory等,否则不能使用8位字节串。

有人可以帮帮我吗?谢谢!

哦,还有,CJKLIB有没有办法在没有任何音调的情况下返回拼音?我认为默认情况下它会返回拼音,用这些奇怪的字符来表示音调,我只想要没有这些音调的字母。

1 个答案:

答案 0 :(得分:1)

您的错误是您没有对输入流进行解码,但是您正在转身并重新编码它就好像它是UTF-8一样。这是错误的方式。

你有两个选择。

您可以使用显式编码codecs.open输入文件,这样您每次读取时都会返回常规Unicode字符串,因为解码是自动的。这总是我的强烈偏好。没有文本文件了。

您的另一个选择是在将二进制字符串传递给函数之前手动解码它。我讨厌这种风格,因为它几乎总是表明你做错了什么,即使它没有做错,所以当它全部离开时它是笨拙的。

我会对输出文件做同样的事情。我只是讨厌在整个地方手动.encode("utf-8").decode("utf-8")。设置流编码并完成它。