基于Python实现四大名著章节标注汉语拼音

news2024/11/19 14:52:21

       起因很单纯,就是给我1年级小豆包的女儿标注三国和西游章节的汉语拼音,我女儿每天都朗读 ,结果有很多字不认识,我爱人居然让我给标记不认识的完了手动注音......我勒个去......身为程序员的我怎么能忘记用程序实现呢,特别是咱也会点Python万能语言。哈哈!列举一下使用的技术。

代码:代码.zip - 蓝奏云

成品:四大名著章节名注音版.zip - 蓝奏云

 

语言:Python3.7

插件:pypinyin0.37.0  和 openpyxl 3.0.3

开发工具:pycharm 社区版

使用openpyxl操作execl的教程多的你无法想。

使用pypinyin将汉字转换成汉语拼音很简单,网络上API一大推。而且简单的不能再简单了,就一句话就实现了。分享点代码:

# 带声调的(默认)
def yinjie(word):
    sentens = "".join(word.split())
    print(sentens)
    s = ''
    # heteronym=True开启多音字
    for i in pypinyin.pinyin(word, heteronym=False):
        s = s + ''.join(i) + " "
    return s

这个就足够汉字转拼音了,不过我要求数据结构就没使用这个方法。我把数据结构说一下。

三层二维数组(这个非常关键):

第一层:单个汉字和汉语拼音构成。

['dì', '第'], ['yī', '一'], ['bǎi', '百'], ['huí', '回']

第二层:按照标题空格分词。

[['dì', '第'], ['yī', '一'], ['bǎi', '百'], ['huí', '回']], [['jìng', '径'], ['huí', '回'], ['dōng', '东'], ['tǔ', '土']], [['wǔ', '五'], ['shèng', '圣'], ['chéng', '成'], ['zhēn', '真']]

第三层:所有标题的集合。

就是第二层的合计,西游记就是100个章节标题集合。

最开始的成果物。这个不好对应也很难阅读。

我爱人给了我一个参考事例。如下图:

咱也不能示弱,咱也是程序员。咱也会万能的Python。

最开始的目标是将文字写入到word中,所以就用了Python-docx。汉语拼音长短不一这个很难对齐。想计算汉语拼音的长度进而计算汉字的位置......这个算法得多复杂,一个排版算法...我不是大神......

这个玩意其实和数学应用题一样,想到了其实一点也不难,就是弄个表格完了让汉语拼音和汉字居中不就得了。想到这个以后其实一点都不难了。使用Python-docx搞了好久有个问题就是竖版的word放不下汉字和汉语拼音。头疼啊。效果如下图:

唉!难道是思路不对。。。

不用Python-docx了。使用openpyxl来操作execl。第一次成果物。看起来还可以。

最终的成果物。

转成PDF的成果物:

继续鼓捣,最终搞定。。。一共花费了近6个小时,时间有点多。其实主要是数据结构和排版耽误时间,在有就是语法,作为Net出身而后转Java的人来说这个…&...就是并且的意思。然而在Python里面他不就是并且是and啊啊啊啊啊!因为这个我改了N多代码调试了好几次,唉深度无语。真是基础不牢地动山摇啊。别废话了上代码:

import pypinyin

from openpyxl import Workbook
from openpyxl.drawing.text import Font
from openpyxl.styles import Font, colors, Alignment

from pulgin.Tools import Tools

class HanZhiAddPinYin:
    def __init__(self):
        pass

    def signWord(self,word):
        pinyicontent = pypinyin.pinyin(word, heteronym=False)
        word_pinyin = [pinyicontent[0][0], word]
        return word_pinyin

    def sentences(self,keyWords):
        listsentense = []
        for duanyu in keyWords.split():
            print(duanyu)
            duanyu_list = []
            for word in duanyu:
                duanyu_list.append(self.signWord(word))
            listsentense.append(duanyu_list)
        print(
            listsentense
        )
        return listsentense

    def articles(self,txt_file_path):
        article = []
        encoding = Tools.get_file_encoding(txt_file_path)
        f = open(txt_file_path, "r", encoding=encoding, errors='ignore')  # 返回一个文件对象
        line = f.readline().strip()  # 调用文件的 readline()方法
        index = 1
        while line:
            article.append(self.sentences(line))
            line = f.readline()
            index = index + 1
        f.close()
        return article

    def builder_execl(self,word_title, save_path, article):
        """
        构建execl文件
        :param word_title: sheet页面的名词
        :param save_path: execl保存路径
        :param article:  文章内容集合
        :return:
        """
        wb = Workbook()
        ws = wb.active
        ws.title = word_title
        ws.sheet_properties.tabColor = "1072BA"  # 设置背景
        xl_sheet = wb.get_sheet_by_name(word_title)
        execl_cell_width = 4.6
        for sentences in article:
            column_index = 1
            # sentences 2行数据
            # 获取行数
            pinyin_row = xl_sheet.max_row + 1  # 拼音所在的行
            hanzi_row = pinyin_row + 1  # 汉字所在的行
            sentences_index = 0
            for duanyu in sentences:  # ['dì', '第'], ['yī', '一'], ['huí', '回']
                for sign_word in duanyu:  # ['dì', '第']

                    # region 设置样式
                    # 设置样式
                    execl_cell_font = Font(name='华文楷体', size=12, italic=False, color=colors.BLACK, bold=True)
                    execl_pinyin_row = xl_sheet.cell(row=pinyin_row, column=column_index)
                    execl_hanzi_row = xl_sheet.cell(row=hanzi_row, column=column_index)
                    execl_pinyin_row.alignment = Alignment(horizontal='center', vertical='center')
                    execl_hanzi_row.alignment = Alignment(horizontal='center', vertical='center')
                    execl_pinyin_row.font = execl_cell_font
                    execl_hanzi_row.font = execl_cell_font

                    xl_sheet.column_dimensions['A'].width = 3
                    xl_sheet.column_dimensions['B'].width = 3
                    xl_sheet.column_dimensions['C'].width = 3
                    xl_sheet.column_dimensions['D'].width = execl_cell_width
                    xl_sheet.column_dimensions['E'].width = execl_cell_width
                    xl_sheet.column_dimensions['F'].width = execl_cell_width
                    xl_sheet.column_dimensions['H'].width = execl_cell_width
                    xl_sheet.column_dimensions['I'].width = execl_cell_width
                    xl_sheet.column_dimensions['G'].width = execl_cell_width
                    xl_sheet.column_dimensions['J'].width = execl_cell_width
                    xl_sheet.column_dimensions['K'].width = execl_cell_width
                    xl_sheet.column_dimensions['L'].width = execl_cell_width
                    xl_sheet.column_dimensions['M'].width = execl_cell_width
                    xl_sheet.column_dimensions['N'].width = execl_cell_width
                    xl_sheet.column_dimensions['O'].width = execl_cell_width
                    xl_sheet.column_dimensions['P'].width = execl_cell_width
                    xl_sheet.column_dimensions['Q'].width = execl_cell_width
                    xl_sheet.column_dimensions['R'].width = execl_cell_width
                    xl_sheet.column_dimensions['S'].width = execl_cell_width
                    xl_sheet.column_dimensions['T'].width = execl_cell_width
                    xl_sheet.column_dimensions['U'].width = execl_cell_width
                    xl_sheet.column_dimensions['V'].width = execl_cell_width
                    xl_sheet.column_dimensions['W'].width = execl_cell_width
                    # endregion

                    xl_sheet.cell(row=pinyin_row, column=column_index, value=sign_word[0])
                    xl_sheet.cell(row=hanzi_row, column=column_index, value=sign_word[1])  # 0 第一百回  1 径回东土 2 五圣成真
                    # print(sentences_index)
                    # print(len(duanyu) + len(sentences[0]))
                    # print(column_index)
                    if sentences_index == 1 and len(duanyu) + len(sentences[0]) == column_index:#坑人的and
                        xl_sheet.cell(row=pinyin_row, column=column_index + 1, value=",")
                        xl_sheet.cell(row=hanzi_row, column=column_index + 1, value=",")
                        column_index = column_index + 1  # 遇到断句多增加一列向后
                    column_index = column_index + 1  # 列向后
                sentences_index = sentences_index + 1  # 三个短语计数器
        wb.save(save_path)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159641.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

再次战胜人类:Meta AI推出首款可以忽悠人的AI模型

文|ShonaCicero,是Meta AI提出的能够在『强权外交』游戏中超越人类的AI模型。它凭借自己"忽悠"人的能力(模拟谈判与合作),成为游戏里的顶级高手。AI模型连外交这活儿都能得心应手了?没错&#xf…

【尚硅谷】Java数据结构与算法笔记07 - 排序算法

文章目录一、排序算法简介二、排序的分类三、冒泡排序3.1 基本介绍3.2 算法图解3.3 代码实现四、选择排序4.1 基本介绍4.2 思路分析4.3 算法图解4.4 代码实现五、插入排序5.1 基本介绍5.2 思路分析5.3 算法图解5.4 代码实现六、希尔排序6.1 简单插入排序存在的问题6.2 基本介绍…

知识点查漏补缺

目录谷粒商城知识点补充前言1 java8新特性之lambda表达式1.1 为什么使用1.2 从匿名类到Lambda的转换1.3 语法总结2 Stream API2.1 概述2.2 创建2.2.1 通过集合2.2.2 通过数组2.2.3 通过Stream的of()2.2.4 创建无限流2.3 中间操作2.3.1 筛选与切片1)、filter2)、limit3)、skip(n…

【数据结构】—— Java实现队列和循环队列

队列与循环队列一、队列1.概念2.队列的使用3.队列的模拟实现二、循环队列1.基本概念2.代码实现一、队列 1.概念 队列:是允许在一端进行插入操作,而在另一端进行删除操作的线性表。 队列是一种先进先出的(First In First Out)的…

商场楼层分布图用什么软件做,高效、便捷的商场二三维地图绘制平台

现在的很多大型购物商场占地面积较大,商品种类繁多,如果没有商场导航,会导致新顾客难以找到想要的店铺和商品,那么大型购物商场导航怎么实现呢?电子地图作为大家最喜闻乐见的高效应用形式,在商业应用中&…

C生万物 | 函数的讲解与剖析【内附众多案例详解】

👑作者主页:Fire_Cloud_1 🏠学习社区:烈火神盾 🔗专栏链接:万物之源——C 一起来学习函数吧!一、函数是什么?二、C语言中函数的分类1、库函数2、自定义函数【⭐⭐⭐】三、函数的参数…

【Linux学习】vim指令集(一)

Linux的最高境界 1、背景 vim是一款多模式的文本编辑器,兼容所有的vi语法,其有多种操作模式,每种模式可以互相切换。vim的安装指令如下所示: yum install -y vim2、vim编辑器的相关指令 常用的vim模式有命令模式、插入模式、底…

Vue项目大概目录介绍

后端,自己学习做个记录.实话是看不懂全靠抄. 这是一个刚建好的Vue项目 node_modules:整个项目用到的依赖文件 public--->favicon.ico:Vue的图标 public--->index.html:可以理解为首页入口,模板页,开发的时候用不到,Vue是个单页面应用,开发也用不到 src:好比项目的源码…

智云通CRM:阻挡客户拜访的三个因素,你中了几个?

拜访客户为什么会迟迟不行动,一般有三个因素,它们分别是“没有主动性”“证明自己的价值需要时间”“我很不专业,需要学习”,因为这三个因素都在诉说一件事——“我需要准备”。智云通CRM统计常见的情形如下。 “我刚刚从事这个…

nginx反向代理、负载均衡、动静结合

目录前言nginx是什么?一.启动异常1.80端口被占用① 关掉占用端口② 修改 nginx.conf 文件2.启动nginx并测试是否启动成功① 启动② 测试 电脑ip 你自己在nginx.conf设置的端口二.应用场景之负载均衡三.应用场景之反向代理1.正向代理和反向代理的区别2.配置反向代理…

Linux常用命令——wget命令

在线Linux命令查询工具(http://www.lzltool.com/LinuxCommand) wget Linux系统下载文件工具 补充说明 wget命令用来从指定的URL下载文件。wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性,如果是由于网络的原因下载失败,…

一款ARPG游戏是如何搭建云真机系统的

随着业内对“工业化”认知的不断提升,越来越多的UWA用户通过UWA Pipeline的各项功能,为项目研发提供了极大的助力。其中的自动化测试与GOT Online性能测评的结合,帮助项目组在每个“测试-反馈”周期内,在大批量真机设备上实现项目…

Linux——信号知识归纳(下)

目录 一.进程状态 二.信号捕捉时机与流程 三.sigaction函数 四.SIGCHLD信号 一.进程状态 linux将进程的状态分为用户态(user mode)和内核态(kernel mode)。 内核态时CPU执行代码不受任何限制,而用户态会做代码安…

MRP的库存供应天数(StckDS)和收货供应天数(RDS)

我们在MD07里面,可以看到三个天数: 1、库存可供应天数(StckDS) 2、第一次日供应量收货(RDS 1) 3、第二接货日期的收货(RDS 2) 而且信号灯的显示就是按照这三个天数来进行设置的 我们以15000047这个物料为例,来看下这三个数是怎么计算的 …

Java集合全解【完整版】

文章目录01 初识集合> 集合是什么?为什么要用集合?> 集合的框架体系02 Collection接口> Collection接口常用方法> Collection接口遍历元素:使用Iterator(迭代器)> Collection接口遍历元素:增…

那个叫郭不戳的博主去哪了--回归篇

文章目录那个叫郭不戳的博主去哪了--回归篇所以你究竟去哪了?有没有好的面试经验啊工作方面怎么样啊卷不卷总结那个叫郭不戳的博主去哪了–回归篇 消失了三个月,今天开始正式回归。一大早打开CSDN看到好多消息,首先谢谢大家对我的认可。接下来…

基于微信小程序云开发的医院体检预约小程序源码,医院体检预约小程序源码,实现体检预约管理、体检预约凭证、预约数据查看导出 版权申诉

功能介绍 对于医院体检科室和体检机构而言,每天的体检人数分布也不太均衡,若很多人集中在 某些天体检,会出现「医生强度大、体检人排队久」的问题。采用体检预约小程序进行体检预约数管理,体检人可预约到更广的日期范围、更精准的…

Apache Spark 机器学习 管道 3

Apache Spark的机器学习管道提供一个统一的、高级的APIs集合,该APIs集合是以数据框架(Datagrams)为基础,帮助开发人员创建或者优化一个用于实际环境的机器学习的管道。 管道(Pipeline)的基本概念 Spark机…

测试之Bug与用例【创建Bug、Bug级别、Bug生命周期、测试用例的万能公式、设计测试用例具体方法】

文章目录1. 如何创建Bug2. Bug的级别3. Bug的生命周期4. 面试题:跟开发产生争执怎么办5. 设计测试用例的万能公式使用万能公式对水杯设计测试用例6. 设计测试用例的具体方法6.1 等价类6.2 边界类6.3 判定表6.4 正交法(allparis)6.5 场景设计法1. 如何创建Bug 提 Bu…

关于USB的事儿

FTDI公司的产品值得研究,包含很多USB转接芯片【串口、SPI、IIC、JTAG】。USB通信芯片本身也是需要编程的,上位机和USB芯片通信是需要驱动的,才能实现对应的识别。上位机(VB、C#、C等一系列面向对象程序)调用dll文件,里面很多API函…