如何用python实现字音回填?

国际音标总结 国际音标总结 作者:毛茏玮 / Saint 掘金:https://juejin.im/user/5aa1f89b6fb9a028bb18966a 微博:https://weibo.com/5458277467/profile?topnav=1&wvr=6&is_all=1 GitHub:github.com/saint-000 知乎:https://www.zhihu.com/people/saint-80-61/columns PS:各位小伙伴,如果有需要的话,可以自取下面的链接: 链接. 阅读详情

前言

本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理。

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取

python免费学习资料以及群交流解答点击即可加入


大家好,今天要给大家分享的是两个word文档处理的案例,核心是读取excel的数据,按照指定的规则写入到word中。

python-docx简介

利用python读写word文档的库是python-docx,安装:

pip install python-docx

python-docx 官方文档:https://python-docx.readthedocs.io/en/latest/
基本的对象关系:

 

单字字音分析处理

之前遇到一个需求:

 

 

分析需求呢,会发现它要求在word文档中添加一行在excel对应的声韵调,若音1声超过1个字符还需将最后一个字符上标,音1韵不上标,音1调需整体上标。

为了解决这个问题,首先我们需要处理出我们需要的数据,每个单字对应的字音(音韵声)。

自然第一步是读取excel文件,最终产生以调查条目为键,声韵调作为值的字典,而音1声超过1个字符需将最后一个字符上标,所以音1声应该把不需上标和需要上标的分开存储,最终形成一个四元组。
看看代码吧:

数据读取

import pandas as pd

df = pd.read_excel("老男单字.xls", usecols=[0, 1, 3, 4, 5], dtype={'编号': 'str'})
df.head()

单字对应的字音字典生成

symbols = {}
for row in df.values:
    k = row[1]
    a = row[2].strip()
    if len(a) > 1:
        v = (a[:-1], a[-1], row[3].strip(), str(row[4]))
    else:
        v = (a, "", row[3].strip(), str(row[4]))
    symbols[k] = v

利用pandas查看生成结果:

pd.DataFrame.from_dict(symbols, 'index').head(10)

测试数据匹配

好,接下来,我们尝试读取word文档的第一个表格,并匹配获取每个字音需要添加的音韵调:

from docx import Document

doc = Document(r"01老男单字字音对照表(兴义).docx")
header_cells = doc.tables[0].rows[0].cells[1:]
for cell in header_cells:
    k = cell.text[5]
    print(cell.text, symbols[k])

打印结果:

0001多 ('t', '', 'o', '44')
0002拖 ('t', 'h', 'o', '44')
0003大~小 ('t', '', 'a', '13')
0004锣 ('l', '', 'o', '21')
0005左 ('t', 's', 'o', '35')
0006歌 ('k', '', 'o', '44')
0007个 ('k', '', 'o', '13')
0008可 ('k', 'h', 'o', '13')

说明数据匹配暂时没有问题。

测试添加数据

然后尝试向第一个表格添加数据,并保存看看效果:

from docx.enum.text import WD_ALIGN_PARAGRAPH

doc = Document(r"01老男单字字音对照表(兴义).docx")
header_cells = doc.tables[0].rows[0].cells[1:]
row_cells = doc.tables[0].add_row().cells[1:]
for header_cell, row_cell in zip(header_cells, row_cells):
    k = header_cell.text[4]
    a, b, c, d = symbols[k]
    (p,) = row_cell.paragraphs
    p.alignment = WD_ALIGN_PARAGRAPH.CENTER
    p.style.font.name = 'IPAPANNEW'
    p.add_run(a)
    p.add_run(b).font.superscript = True
    p.add_run(c)
    p.add_run(d).font.superscript = True
doc.save("tmp.docx")

结果:

 

 

可以看到已经顺利添加进去,并没有什么问题。

最终测试

现在改下代码,添加所有单元格:

doc = Document(r"01老男单字字音对照表(兴义).docx")
for t in doc.tables:
    header_cells = t.rows[0].cells[1:]
    row_cells = t.add_row().cells[1:]
    for header_cell, row_cell in zip(header_cells, row_cells):
        k = header_cell.text[4]
        a, b, c, d = symbols[k]
        (p,) = row_cell.paragraphs
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p.style.font.name = 'IPAPANNEW'
        p.add_run(a)
        p.add_run(b).font.superscript = True
        p.add_run(c)
        p.add_run(d).font.superscript = True
doc.save("result.docx")

结果:

 

 

可以看到,都顺利添加了对应的字音,但有点不太满意,有部分整行都是空白单元格,应该删除更佳。

增加删除空行的代码:

doc = Document(r"01老男单字字音对照表(兴义).docx")
for t in doc.tables:
    ## 从第四行开始检查并去除表格的空白行
    for row in t.rows[3:]:
        if np.all([cell.text == "" for cell in row.cells]):
            t._tbl.remove(row._tr)
    ## 取出第一行从第二个开始所有单元格
    header_cells = t.rows[0].cells[1:]
    ## 取出新增一行从第二个开始所有单元格
    row_cells = t.add_row().cells[1:]
    for header_cell, row_cell in zip(header_cells, row_cells):
        k = header_cell.text[4]
        a, b, c, d = symbols[k]
        (p,) = row_cell.paragraphs
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p.style.font.name = 'IPAPANNEW'
        p.add_run(a)
        p.add_run(b).font.superscript = True
        p.add_run(c)
        p.add_run(d).font.superscript = True
doc.save("result.docx")

再次执行,office打开的结果:

 

 

可以看到空行已经都顺利的被删除。

完整处理代码

整个过程已经完整测试通过,最终完整处理代码为:

from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx import Document
import pandas as pd
import numpy as np

df = pd.read_excel("老男单字.xls", usecols=[1, 3, 4, 5])
symbols = {}
for row in df.values:
    k = row[0]
    a = row[1].strip()
    if len(a) > 1:
        v = (a[:-1], a[-1], row[2].strip(), str(row[3]))
    else:
        v = (a, "", row[2].strip(), str(row[3]))
    symbols[k] = v

doc = Document(r"01老男单字字音对照表(兴义).docx")
for t in doc.tables:
    ## 从第四行开始检查并去除表格的空白行
    for row in t.rows[3:]:
        if np.all([cell.text == "" for cell in row.cells]):
            t._tbl.remove(row._tr)
    ## 取出第一行从第二个开始所有单元格
    header_cells = t.rows[0].cells[1:]
    ## 取出新增一行从第二个开始所有单元格
    row_cells = t.add_row().cells[1:]
    for header_cell, row_cell in zip(header_cells, row_cells):
        k = header_cell.text[4]
        a, b, c, d = symbols[k]
        (p,) = row_cell.paragraphs
        p.alignment = WD_ALIGN_PARAGRAPH.CENTER
        p.style.font.name = 'IPAPANNEW'
        p.add_run(a)
        p.add_run(b).font.superscript = True
        p.add_run(c)
        p.add_run(d).font.superscript = True
doc.save("result.docx")

词汇音分析处理

需求2:

 

 

当然有部分词汇存在两个词就需要换行都写入:

 

上标规则是所有的数字和h都上标,其他不用上标。

那同样的思路,先读取excel并解析出需要的数据:

数据读取并解析

import pandas as pd

df = pd.read_excel("词汇(凯里).xls", index_col=0)
df.tail()

结果:

 

## 词音按照不是h而且不是数字,以及是h,和是数字 三种规则切分
df['词1音'] = df['词1音'].str.findall("[^h\d]+|h|\d+")
df['词2音'] = df['词2音'].str.findall("[^h\d]+|h|\d+")
df = df[["词1字", "词1音", "词2字", "词2音"]]
df.tail()

结果:

 

 

最终想得到的处理结果:

symbols = df.to_dict('index')

word文档编号转换测试

运行以下代码:

from docx import Document

doc = Document(r"02词汇对照表(兴义).docx")
i = 0
for t in doc.tables:
    ## 取出第一行从第二个开始所有单元格
    header_cells = t.rows[0].cells[1:]
    for header_cell in header_cells:
        k = int(header_cell.text[:4].replace('ʰ', '9'))

未发现任何报错,说明对应编号获取成功,于是就可以通过将键k传入symbols获取需要写入的数据。

最终word生成代码

from docx import Document

doc = Document(r"02词汇对照表(兴义).docx")
for t in doc.tables:
    ## 取出第一行从第二个开始所有单元格
    header_cells = t.rows[0].cells[1:]
    ## 取出新增一行从第二个开始所有单元格
    row_cells = t.add_row().cells[1:]
    for header_cell, row_cell in zip(header_cells, row_cells):
        k = int(header_cell.text[:4].replace('ʰ', '9'))
        symbol_dict = symbols[k]
        if not pd.isna(symbol_dict['词2字']):
            row_cell.add_paragraph()
        for i, p in enumerate(row_cell.paragraphs, 1):
            p.style.font.name = 'IPAPANNEW'
            p.add_run(symbol_dict[f'词{i}字']).font.name = "宋体"
            for n, e in enumerate(symbol_dict[f'词{i}音']):
                run = p.add_run(e)
                if n % 2 == 1:
                    run.font.superscript = True

doc.save("result.docx")

完整处理代码

from docx import Document
import pandas as pd

df = pd.read_excel("词汇(凯里).xls", index_col=0)
## 词音按照不是h而且不是数字,以及是h,和是数字 三种规则切分
df['词1音'] = df['词1音'].str.findall("[^h\d]+|h|\d+")
df['词2音'] = df['词2音'].str.findall("[^h\d]+|h|\d+")
df = df[["词1字", "词1音", "词2字", "词2音"]]
symbols = df.to_dict('index')

doc = Document(r"02词汇对照表(兴义).docx")
for t in doc.tables:
    ## 取出第一行从第二个开始所有单元格
    header_cells = t.rows[0].cells[1:]
    ## 取出新增一行从第二个开始所有单元格
    row_cells = t.add_row().cells[1:]
    for header_cell, row_cell in zip(header_cells, row_cells):
        k = int(header_cell.text[:4].replace('ʰ', '9'))
        symbol_dict = symbols[k]
        if not pd.isna(symbol_dict['词2字']):
            row_cell.add_paragraph()
        for i, p in enumerate(row_cell.paragraphs, 1):
            p.style.font.name = 'IPAPANNEW'
            p.add_run(symbol_dict[f'词{i}字']).font.name = "宋体"
            for n, e in enumerate(symbol_dict[f'词{i}音']):
                run = p.add_run(e)
                if n % 2 == 1:
                    run.font.superscript = True

doc.save("result.docx")

最终结果:

 

国际音标字体转换代码 IpaPanAdd 转 ipapannew 国际音标字体转换代码 IpaPanAdd 转 ipapannew 支持word 国际音标字体转换代码 IpaPanAdd 转 ipapannew 支持word 国际音标字体转换代码 IpaPanAdd 转 ipapannew 支持word 立即下载

相关推荐

国际音标学习软件(超好用).rar

国际音标学习软件这是针对英语听力和口语的专业学习软件,是一个应用型的软件

[Python] 使用Python对数据库中的表添加主键id

本文主要讲解使用Python对数据库中的表添加主键id

Hudas的博客 1839

IPA Help國際音標學習軟件

國際音標學習軟件 國際音標學習軟件 國際音標學習軟件 國際音標學習軟件 國際音標學習軟件

python导入到mysql设置主键_Python3 操作 MySQL 插入一条数据并返回主键 id的实例

Python3 操作 MySQL 插入一条数据并返回主键 id的实例发布时间:2020-08-29 11:39:47来源:脚本之家阅读:110作者:极客点儿Python 中貌似并没有直接返回插入数据 id 的操作(反正我是没找到),但是我们可以变通一下,找到最新插入的数据#!/usr/bin/env python3# -*- coding: UTF-8 -*-import pymysqldb = ...

weixin_39624700的博客 781

英语音标字体安装器

英语音标字体安装器 使系统支持音标 避免乱码等状况

运放电路实战:5分钟搞定加法器与减法器的电路设计与调试(附避坑指南)

本文从实战角度出发,详细讲解了运算放大器加法器与减法器的电路设计与调试方法。针对加法器,重点分析了利用“虚地”特性简化设计和选型要点;对于减法器,则深入剖析了决定精度的核心——电阻匹配问题,并提供了使用电阻网络等提升共模抑制比的实用策略。文章还分享了从仿真到实物焊接的完整流程与常见避坑技巧,帮助电子爱好者快速掌握这两种基础运放电路。

weixin_28323057的博客 469

国际音标

元音 单元音 长元音 i: R: U: E: B:      

biaocai的专栏 1005

Xilinx FPGA 10G Ethernet Subsystem example

The 10G Ethernet subsystem provides 10 Gb/s Ethernet MAC, Physical Coding Sublayer(PCS) and Physical Medium Attachment (PMA) transmit and receive functionality over anAXI4-Stream interface.

青城扬沙的博客 2382

python 去除dataframe中的空行_利用python实现字音回填

作者:小小明大家好,我是小小明,今天我要给大家分享的是两个word文档处理的案例,核心是读取excel的数据,按照指定的规则写入到word中。之前们已经分享过一些pandas读写excel的例子,这次我们需要在此基础上还需读写word文档。python-docx简介利用python读写word文档的库是python-docx,安装:pipinstallpython-docxpytho...

weixin_28864485的博客 873

基于STM32F103与AD8232的便携式心电监测系统设计与实现

本文详细介绍基于STM32F103微控制器与AD8232心电传感器模块的便携式心电监测系统设计与实现。系统通过ADC采集心电信号,结合软件滤波算法处理基线漂移和工频干扰,并利用OLED屏幕实时显示波形,具有低成本、高实用性的特点,适用于健康监测与嵌入式学习。

m5n6o7的博客 738

手把手教你用UM982搭建厘米级RTK定位系统(附避坑指南)

本文详细介绍了如何使用UM982模组搭建厘米级RTK定位系统,涵盖硬件连接、软件配置和深度优化技巧。UM982支持BDS、GPS、GLONASS和Galileo等多系统全频点信号,特别适合精准农业、无人机导航等高精度应用场景。通过实战案例和避坑指南,帮助开发者快速实现厘米级定位精度。

y7z8a的博客 1441

python 去除dataframe中的空行_【word文档自动化处理】用python实现字音回填

大家好,我是小小明,今天我要给大家分享的是两个word文档处理的案例,核心是读取excel的数据,按照指定的规则写入到word中。之前们已经分享过一些pandas读写excel的例子,这次我们需要在此基础上还需读写word文档。python-docx简介利用python读写word文档的库是python-docx,安装:pipinstallpython-docxpython-docx...

weixin_32392583的博客 337

Keil MDK安装NRF52832开发环境全攻略(附系统时间错误解决方案)

本文详细介绍了如何使用Keil MDK搭建NRF52832开发环境,包括基础软件安装、项目配置关键步骤以及常见问题解决方案。特别针对系统时间错误导致的编译失败问题提供了实用解决方法,帮助开发者快速上手NRF52832开发。

weixin_29168153的博客 506

python-docx实战案例-字音回填

大家好,我是小小明,今天我要给大家分享的是两个word文档处理的案例,核心是读取excel的数据,按照指定的规则写入到word中。 之前们已经分享过一些pandas读写excel的例子,这次我们需要在此基础上还需读写word文档。 python-docx简介 利用python读写word文档的库是python-docx,安装: pip install python-docx python-docx 官方文档: https://python-docx.readthedocs.io/en/latest/ 基本

小小明-代码实体的专栏 3万+

在 Android Studio 中接入 DeepSeek:加速 Android 开发进程

通过在 Android Studio 中接入 DeepSeek,Android 开发者能够充分利用人工智能技术带来的强大优势,显著提升开发效率和代码质量。从前期的安装准备,到具体的接入步骤,再到使用过程中的技巧和注意事项,每一个环节都为打造高效、智能的开发环境提供了有力支持。希望本文能帮助你顺利将 DeepSeek 融入到 Android Studio 的开发工作流程中,让你在 Android 开发的道路上更加得心应手,创造出更优质的 Android 应用。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 4176

Python入门实战:Python生物信息学编程基础

本文旨在为生物学背景的研究人员和对生物信息学感兴趣的程序员提供一个全面的Python生物信息学编程入门指南。我们将从Python基础知识开始,逐步深入到生物信息学特定的工具和技术,最终达到能够独立开发生物信息学分析程序的水平。Python编程基础生物信息学常用数据结构和算法DNA和蛋白质序列分析基因组数据处理生物信息学数据可视化Biopython库的使用实际项目案例背景介绍:概述文章目的、范围和预期读者核心概念与联系:介绍Python和生物信息学的基本概念。

AI架构师小马 1514

数据接口实战:从HTTP API到硬件I2S的采集策略与反反爬技巧

数据接口是系统间交换信息的标准化通道,其核心原理在于遵循特定协议实现数据的请求与响应。在技术层面,接口的价值在于解耦系统、提升数据流动效率,广泛应用于金融数据获取、物联网传感器读取、Web服务集成等场景。无论是通过HTTP API获取股票行情,还是利用I2S接口读取PDM麦克风音频流,稳定的数据采集都面临访问限制与协议适配的挑战。为此,开发者常借助请求头模拟、IP代理轮换等反反爬策略,以合规方式模拟正常访问,确保采集流程的可靠性。本文聚焦数据接口调用与“欺骗器”技术,深入解析金融终端、硬件接口等多元数据源的

weixin_30565327的博客 447

银行一表通监管报送系统详解

国家金融监管总局对于“一表通”的总体描述为:通过建立一套明细级、标准化的数据体系和汇总计算规则,将银行机构传送至监管可信区的业务明细数据汇总生成财务指标、监管指标和监管报表,大幅提升监管数据时效性,统一数据标准,实现数据间的穿透和整合,同时改变机构多头报送数据模式,减轻机构报送负担。

银行信息系统应用架构详解 2522

python对word文档处理

python-docx是基于免费的LibreOffice开发的,wps或者office有些地方适配不太一样,需要手动修改源码,有问题可以一起研究。,里边有详细的使用文档,开源免费的。主要的库 python-docx。

students_00的博客 494

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【笔记】Python-docx写文档时逐字符设置字体与上下标

暂时琢磨出来这么一个还能用的逐字符设定格式的法子。问就是初版写出来时单双引号变成了新罗马字体,先这样了。

循此苦旅,以达天际 893

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

国际音标字符表

ɐ ɑ ɒ ɓ ɔ ɕ ɖ ɗ ɘ ə ɚ ɛ ɜ ɝ ɞ ɟ ɠ ɡ ɢ ɣ ɤ ɥ ɦ ɧ ɨ ɩ ɪ ɫ ɬ ɭ ɮ ɯ ɰ ɱ ɲ ɳ ɳ ɴ ɵ ɶ ɷ ɸ ɹ ɺ ɻ ɼ ɽ ɾ ɿ ʀ ʁ ʂ ʃ ʄ ʅ ʆ ʇ ʈ ʉ ʊ ʋ ʌ ʍ ʎ ʏ ʐ ʑ ʒ ʓ ʔ ʕ ʖ ʗ ʘ ʙ ʚ ʛ ʜ ʝ ʞ ʟ ʠ ʡ ʢ ʣ ʤ ʥ ʦ ʧ ʨ...

mypyg的专栏 9579

JAVA写的网页爬虫爬取必应词典的词汇音标

为了建立一个英语词汇音标库,需要从网上搜索词汇音标,由于有10万多个词汇需要处理,所以做个这个单词音标爬虫爬取必应网络词典网页上的单词音标。 package bingword; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io

MAILLIBIN的专栏 5910

python音标html实体转换

例如: 音标ə 用hmtl实体表示为ə 反过来转换为unichr(601).encode('utf-8') 或者 unichr(int('0x259', 16)).encode('utf-8')   国际音标与html实体转换列表 http://tlt.its.psu.edu/suggestions/international/b

Alps__的专栏 1874

用Python写了一个图像文字识别OCR工具

在之前的文章里,我们多次尝试用Python实现文本OCR识别!不过今天我们要搞一个升级版:直接写一个图像文字识别OCR工具!引言最近在技术交流群里聊到一个关于图像文字识别的需求,在工作、生...

张俊红的个人博客 1771

实现数据回填

来源于老师+++ (控制器) 数据回填是先查询出你那一张表是需要回填数据的 public ActionResult SelectNoticeTypeDetailById(int noticeTypeDetailId) { try { SYS_NoticeTypeDetail noticeTypeDetail = (from tbNoticeTypeDetail in myModels.SYS_No...

小张博客 751
上一篇: Python中“等于“到底用 == 还是 is?
下一篇: 用 Python 检验时间序列的平稳性
酸菜鱼编程
博客等级 码龄6年 155粉丝 63原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值