茕茕孑立 沆瀣一气
踽踽独行 醍醐灌顶
绵绵瓜瓞 奉为圭臬
龙行龘龘 犄角旮旯
娉婷袅娜 涕泗滂沱
呶呶不休 不稂不莠
一首《生僻字》,考验的是“语文”硬实力。倘若实力不够,其实可以拿Python来凑,毕竟库多!今天就来说一个神奇pypinyin库,库如其名,python版本的拼音库。也很简单,可以将汉字转为拼音。
最终效果
个人最喜欢print到命令行中的样式
当然,正规的操作是读取汉字txt文本,通过代码生成注音版本:
思路
很简单,拼音库可以把汉字转化为拼音,那我们要做的就是读取文本,获取拼音,最后将文本和拼音重新拼接。高深的算法没有,基本围绕字符串和列表的操作拼接,有兴趣的朋友可以体验下。
pypinyin库
首先是安装,pip install pypinyin
装好后引入模块from pypinyin import pinyin
直接调用 pinyin(“生僻字”),即可得到拼音列表 [[‘shēng’], [‘pì’], [‘zì’]]
读写txt文本
基本是入门阶段读写txt文件的简单应用:
txt_name = "生僻字"
with open("%s.txt"%txt_name,encoding="UTF-8-sig") as f:
content = f.read()
input_str = content
result = transfer(input_str)
print(result)
with open("%s_拼音.txt"%txt_name,'w',encoding='UTF-8-sig') as m:
m.write(result)
拼接
这里涉及到中文字符占2个字节,写入txt时编码格式的选择,摸索半天勉强做到大致上一一对应。
def transfer(text):
#去除字符串中空格
no_space_text = ''.join(text.split(" "))
raw_list = []
temp = ""
for i in range(len(no_space_text)):
if is_Chinese(no_space_text[i]):
if temp != "":
raw_list.append(temp)
temp=""
raw_list.append(no_space_text[i])
else:
temp+=no_space_text[i]
#生成拼音列表
pylist = pinyin(no_space_text)
#将拼音列表和字符串拼接对齐
text_list = []
pinyin_list = []
for i in range(len(raw_list)):
if is_Chinese(raw_list[i]):
pinyin_list.append(pylist[i][0].ljust(6, ' '))
text_list.append(raw_list[i].ljust(5,' '))
else:
pinyin_list.append(pylist[i][0])
text_list.append(raw_list[i])
pinyin_str = ''.join(pinyin_list)
text_str = ''.join(text_list)
pinyin_line_list = pinyin_str.split('\n')
text_line_list = text_str.split("\n")
final_result = ""
for i in range(len(pinyin_line_list)):
final_result += pinyin_line_list[i] + '\n' + text_line_list[i] + "\n"
return final_result
回顾
最初是在接触一个读取剪贴板内容的pyperclip模块,琢磨对剪贴板中字符串如何操作。正好又听到生僻字那首歌,想到既然逐字查拼音是个麻烦事,何不通过Python来批量添加拼音呢?幸运的是还真有大牛写了拼音库,可以拿来直接用。
昨天完成的代码,是对剪贴板中复制的内容添加拼音,感觉实用性不强且不方便,故今天修改为读取txt文本生成注音版本。
代码下载
Github代码下载
代码中有两点,在这记录下:
- 读写txt文档时,encoding="UTF-8-sig"是为了去除utf-8带的BOM头’\ufeff’
- 通常汉字都在’\u4e00’ 和 '\u9fff之间,但是生僻字如“㙓” 位于拓展库 ‘\u3400’ 到 '\u4DB5’之间
参考链接
最后
最后再放个《离骚》文本的注音版,还不错,嘿~