利用python实现字音回填

作者:小小明

python-docx简介

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

pip install python-docx

python-docx 官方文档:https://python-docx.readthedocs.io/en/latest/

基本的对象关系:

单字字音分析处理

之前遇到一个需求:

image-20201230110530386

分析需求呢,会发现它要求在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()
编号 调查条目 音1声 音1韵 音1调
0001 t o 44
0002 th o 44
0003 t a 13
0004 l o 21
0005 ts o 35

单字对应的字音字典生成

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')

结果:

image-20201230113721185

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

最终测试

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

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 = Truedoc.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_PARAGRAPHfrom docx import Documentimport pandas as pdimport 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 = Truedoc.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 = 0for 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 Documentimport 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')

最终结果:

(0)

相关推荐

  • RPA手把手——python

    艺赛旗|做RPA生态先行者 RPA10.0全新首发免费下载 点击下载 艺赛旗-RPA机器人免费下载|提供流程自动化解决方案​www.i-search.com.cn 引入会用到的库 from docx ...

  • (1条消息) Python对word文档进行操作

    Python-docx Python-docx是专门针对于word文档的一个模块,只能操作docx 不能读取doc文件.在这里python-docx主要的功能是对docx文件进行操作,管理等. 官方文 ...

  • 使用python-docx模块读写word文件

    word文档的自动化处理是一件比较头痛的事情,因为深耕于windows操作系统,对于跨平台需求的word文档编辑,是非常痛苦的一件事.在python的生态环境中,提供了python-docx这个模块, ...

  • 使用Python自动化Microsoft Excel和Word

    将Excel与Word集成,无缝生成自动报告 毫无疑问,微软的Excel和Word是公司和非公司领域使用最广泛的两款软件.它们实际上是"工作"的同义词.通常情况下,每一周我们都会将 ...

  • Python Word文档自动化,万字干货教程

    来源:超级大洋葱806 环境安装 使用Python操作word大部分情况都是写操作,也有少许情况会用到读操作,在本次教程中都会进行讲解,本次课程主要用到以下4个库,请大家提前安装. 升级pip(便于安 ...

  • 【代工案例002】批量发送Word工资条

    ▎具体需求 某公司财务,每个月要发送几百个员工的工资条,数据均来源于Excel,需要转成Word文档格式,并发送. Excel工资信息 Word工资条信息 收件效果 ▎思路分析 首先,需要对Excel ...

  • 第105天: Python 操作 Word

    上次给大家介绍了 Python 如何操作 Excel ,是不是感觉还挺有趣的,今天为大家再介绍下,用 Python 如何操作 Word ,这个可能跟数据处理关系不大,用的也不多,不过可以先了解下都能实 ...

  • Word| 办公自动化

    Word| 办公自动化

  • 【Python 库】解析PDF文本及表格

    pdf 是个异常坑爹的东西,有很多处理 pdf 的库,但是没有完美的. 一.pdfminer3k pdfminer3k 是 pdfminer 的 python3 版本,主要用于读取 pdf 中的文本. ...

  • 利用python tushare pandas进行财报分析

    一.财报分析 大家在购买股票的时候,已经不只是凭感觉去买了,基本上都会对一个股票进行深入的分析. 毕竟购买股票还是一项风险性较高的投资,需要在较为熟悉以后才能去开展,不能蛮干,钱也都不是天上掉下来的. ...

  • 利用Python实现财务分析/经营分析自动化

    之前写公司研究报告时,所有的数据都是通过翻看招股说明书/年报的PDF获取的,把数字从PDF里复制粘贴到EXCEL里再生成图表的过程非常繁琐,而且容易因为看错行/列摘错数据.使用Python可以实现提取 ...

  • 利用Python绘制关系网络图

    我们在做数据可视化时,要展现多个元素之间的相互关系时(比如人物关系图),常会用到网络图. 今天我们就分享一个在 Python 里绘制网络图的库:NetworkX,并显示它的基本操作. 一.Networ ...

  • (1条消息) 程序员:利用Python实现可控制肉鸡的反向Shell

    一.初识 1.1 用 Python 实现一个可以管理多个肉鸡的反向 Shell,为什么叫反向 Shell 呢?反向就是肉鸡作为 Client 主动连接到我们的 Server 端,以实现对多个远程主机的 ...

  • Python爬虫威武!利用Python下载某度文库任意资源!

    Python爬虫威武!利用Python下载某度文库任意资源!

  • 利用Python采集股票信息,数据分析出最佳选择!

    利用Python采集股票信息,数据分析出最佳选择!

  • 利用Python自动生成Excel数据报表

    所以今天就带大家来实战一波,使用Python自动化生成数据报表! 从一条条的数据中,创建出一张数据报表,得出你想要的东西,提高效率. 主要使用到pandas.xlwings以及matplotlib这几 ...

  • 【利用python进行数据分析——基础篇】利用Python处理和分析Excel表中数据实战

    作为一个学习用Python进行数据分析的新手来说,通过本文来记录分享一些我在用Python中的pandas.numpy来分析Excel表中数据的数据清洗和整理的工作,目的是熟悉numpy以及panda ...

  • 利用python开发游戏

    今天我们利用python的tkinter来制作几个简单小游戏 首先我们了解下tkinter Tkinter: Tkinter模块(TK接口)是Python的标准Tk GUI工具包的接口.Tkinter ...