我正在尝试将一堆汉字转换为拼音,从一个文件中读取字符并将拼音写入另一个文件。我正在使用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有没有办法在没有任何音调的情况下返回拼音?我认为默认情况下它会返回拼音,用这些奇怪的字符来表示音调,我只想要没有这些音调的字母。
答案 0 :(得分:1)
您的错误是您没有对输入流进行解码,但是您正在转身并重新编码它就好像它是UTF-8一样。这是错误的方式。
你有两个选择。
您可以使用显式编码codecs.open
输入文件,这样您每次读取时都会返回常规Unicode字符串,因为解码是自动的。这总是我的强烈偏好。没有文本文件了。
您的另一个选择是在将二进制字符串传递给函数之前手动解码它。我讨厌这种风格,因为它几乎总是表明你做错了什么,即使它没有做错,所以当它全部离开时它是笨拙的。
我会对输出文件做同样的事情。我只是讨厌在整个地方手动.encode("utf-8")
和.decode("utf-8")
。设置流编码并完成它。