Python: 使用CJKLIB将汉字转换为拼音

2 投票
1 回答
2476 浏览
提问于 2025-04-17 00:29

我正在尝试把一堆汉字转换成拼音,汉字是从一个文件里读取的,而拼音则写入另一个文件。我正在使用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 个回答

1

你的问题在于,你没有对输入流进行解码,但却又把它当作UTF-8格式重新编码。这是错误的做法。

你有两个选择。

第一种选择是用codecs.open来打开输入文件,并明确指定编码方式。这样每次读取文件时,你都会得到正常的Unicode字符串,因为解码是自动进行的。我个人非常推荐这种方法。现在已经没有所谓的文本文件了。

第二种选择是,在把数据传给函数之前,手动解码你的二进制字符串。我不喜欢这种做法,因为这几乎总是意味着你在做错事,即使不是,这种方式也非常笨拙。

对于输出文件,我也会采取同样的做法。我真的不喜欢到处看到手动使用.encode("utf-8").decode("utf-8")。设置好流的编码就可以了,别再纠结了。

撰写回答