• 【办公类-21-04】20240227单个word按“段落数”拆分多个Word(三级育婴师操作参考题目 有段落文字和表格 1拆13份)


    作品展示

    背景需求:

    最近学育婴师,老师发了一套doc操作参考

    但是老师是一节节授课的,每节都有视频,如果做在一个文档里,会很长很长,容易找不到。所以我需要里面的单独文字的docx。

    以前的方法是

    1、打开源文件,保留第1题,删除2-13题,再另存题目1,

    2、再恢复原始状态,保留第2题,删除第1题、第3-13题,在另存题目2

    ……

    之前试过把多个word合并成1个word,

    【办公类-21-01】20240117育婴师操作题word合并1.0-CSDN博客文章浏览阅读912次,点赞15次,收藏10次。【办公类-21-01】20240117育婴师操作题word合并1.0https://blog.csdn.net/reasonsummer/article/details/135651389?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22135651389%22%2C%22source%22%3A%22reasonsummer%22%7D

    现在想试试能不能把1个word拆分成多个word

    解题思路:

    一、另存为docx文件

    二、去除word里面的空行回车

    1. from docx import Document
    2. from openpyxl import load_workbook
    3. import glob
    4. import re
    5. # 将模板 Excel 读取进程序:
    6. path = r"C:\Users\jg2yXRZ\OneDrive\桌面\三级操作题"
    7. file=path + r'\育婴师三级教育操作参考.docx' # 必须是docx
    8. print(file)
    9. # C:\Users\jg2yXRZ\OneDrive\桌面\三级操作题\育婴师三级教育操作参考2.docx
    10. # 提取四个加粗标题所在的行数 # 参考https://www.shouxicto.com/article/96876.html
    11. doc= Document(file)
    12. # 遍历每个段落并判断是否为空白行,如果有空白行,就删除
    13. for paragraph in doc.paragraphs:
    14. if not paragraph.text.strip():
    15. # 如果是空白行则将其从文档中移除
    16. p = paragraph._element
    17. p.getparent().remove(p)
    18. doc.save(path + r'\育婴师三级教育操作参考(去掉回车).docx')

    三、读取word里面“加粗标题”所在的行

    1. print('----2、读取word里面标题加粗段落的行数------')
    2. filename=path + r'\育婴师三级教育操作参考(去掉回车).docx'
    3. # 打开Word文档
    4. doc = Document(filename)
    5. d=len(doc.paragraphs)
    6. print(d)
    7. # docx没有去掉空行前,一共有258段文字
    8. # docx去掉空行后,一共有244段文字
    9. h=[]
    10. s=[]
    11. # 遍历文档中的段落
    12. for i, paragraph in enumerate(doc.paragraphs):
    13. if paragraph.runs:
    14. # 检查段落中的所有运行对象
    15. for run in paragraph.runs:
    16. if run.bold:
    17. # 如果运行对象的文字为加粗,则打印段落索引
    18. # print("段落", i, "的文字被加粗了")
    19. h.append(i)
    20. # 提取每一份的加粗标题
    21. t=doc.paragraphs[i].text
    22. # print(t)
    23. s.append(t)
    24. s=list(set(s))
    25. s.sort()
    26. # print(s)
    27. # ['3.1.1 运用发育诊断法对2岁婴儿的以不同步子行走能力进行测试', '3.1.2 为2岁婴儿编制规范、适宜的个别化游戏活动计划(5分钟)', '3.1.3 设计生活中婴儿动手自理的活动(5分钟)', '3.1.4 六个月以内
    28. # 的婴儿的精细动作的日常练习活动设计(5分钟)', '3.1.5 列举两种感统练习器械,并简述其活动功能(5分钟)', '3.2.1 请阐述对婴儿语言发展水平的观察与记录方法(5分钟)', '3.2.2 如何制定婴幼儿个别化
    29. # 语言培养计划(5分钟)', '3.2.3 设计一份记录表格,观察一个6个月左右的宝宝寻找不同声源的感知练习过程(5分钟)', '3.2.4 设计一个观察表,观察并调整婴儿在视动协调方面的练习(5分钟)', '3.2.5 设
    30. # 计一个观察表,记录孩子可能发生的行为(5分钟)', '3.3.1 如何对待任性的孩子(5分钟)', '3.3.2 如何对待爱哭的孩子(5
    31. # print(len(s))
    32. # 13
    33. h=list(set(h))
    34. h.sort()
    35. j=h[1:]
    36. j.append(d)
    37. print(h)
    38. print(len(h))
    39. print(j)
    40. print(len(j))
    41. # # 去掉空行前
    42. # # [1, 25, 48, 64, 77, 95, 117, 136, 158, 179, 200, 218, 238]
    43. # # 13
    44. # # [25, 48, 64, 77, 95, 117, 136, 158, 179, 200, 218, 238, 258]
    45. # # 13
    46. # # 去掉空行后
    47. # # [1, 23, 45, 60, 72, 89, 110, 127, 148, 168, 188, 205, 224]
    48. # # 13
    49. # # [23, 45, 60, 72, 89, 110, 127, 148, 168, 188, 205, 224, 244]

    1、提取加粗标题的文字部分,做保存的文件名

    2、提取两个黑体加粗标题之间的行数

    四、word里面有表格,它也占了段落数,但段落里不显示

    直接删除小于23并大于45的段落,生成第2套题目

    1. print('----3、读取word里面标题加粗段落的行数+表格占的段落数------')
    2. # 拆分docx(读取加粗的行,这些行还要加上表格的行数)
    3. # 13张表格里面分别有几个表格
    4. imagePath1=path+r'\育婴师13题拆分'
    5. if not os.path.exists(imagePath1): # 判断存放图片的文件夹是否存在
    6. os.makedirs(imagePath1) # 若图片文件夹不存在就创建
    7. # for x in range(len(s)):
    8. # 获取第一页的段落和表格
    9. # a=int(j[x]+o[x])
    10. for x in range(len(s)):
    11. doc = Document(filename)
    12. first_page_paragraphs = []
    13. first_page_tables = []
    14. for element in doc.element.body:
    15. if element.tag.endswith(('}p', '}tbl')):
    16. if element.getparent().index(element) >int(j[x]) :
    17. if element.tag.endswith('p'):
    18. first_page_paragraphs.append(element)
    19. else:
    20. first_page_tables.append(element)
    21. if element.getparent().index(element)<int(h[x]):
    22. if element.tag.endswith('p'):
    23. first_page_paragraphs.append(element)
    24. else:
    25. first_page_tables.append(element)
    26. # print(int(j[x]+o[x]))
    27. # print(int(h[x]+o[x]))
    28. # 删除第一页的段落和表格
    29. for paragraph in first_page_paragraphs:
    30. p = paragraph.getparent()
    31. p.remove(paragraph)
    32. for table in first_page_tables:
    33. t = table.getparent()
    34. t.remove(table)
    35. # # 保存修改后的文档为新文件
    36. # doc.save(path+r'01.docx')
    37. doc.save(imagePath1+r'\{} {}.docx'.format('%02d'%x,s[x]))

    结果第2份前面多了2行,后面少了2行。

    分析后认为,可能导致错行的原因是每份操作题内有“表格”。

    第1份题目里面有2个表格,也占了2行,虽然表格被删除了,但是段落占位没有删除,导致第2份题目表格出现正好2行的的错位。

    计算每份题中表格的数量 2、1、0、1、1、1、1、1、1、1、1、0、0、0

    1. print('----3、读取word里面标题加粗段落的行数+表格占的段落数------')
    2. # 拆分docx(读取加粗的行,这些行还要加上表格的行数)
    3. # 13张表格里面分别有几个表格
    4. bg=[2,1,0,1,1,1,1,1,1,1,0,0,0]
    5. # 第一张表是原来的段落数,所以就是0
    6. bg.insert(0,0)
    7. # print(bg)
    8. # 数字累加
    9. o = []
    10. sum = 0
    11. for num in bg:
    12. sum += num
    13. o.append(sum)
    14. print(o)
    15. # [0, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]
    16. # # # 没有空行的内容

            确保第2份开始的段落数+累计的表格数

    结果正确

    全部代码

    1. # https://blog.csdn.net/lau_jw/article/details/114383781
    2. '''
    3. 目的:育婴师word题目拆分成多个表格(根据标题(加粗)所在行数拆分)
    4. 作者:阿夏
    5. 时间:2024年2月27日
    6. '''
    7. from docx import Document
    8. from openpyxl import load_workbook
    9. import glob
    10. import re,os
    11. print('----1、word数据清洗------')
    12. path = r"C:\Users\jg2yXRZ\OneDrive\桌面\三级操作题"
    13. file=path + r'\育婴师三级教育操作参考.docx' # 必须是docx
    14. print(file)
    15. # C:\Users\jg2yXRZ\OneDrive\桌面\三级操作题\育婴师三级教育操作参考2.docx
    16. # 提取四个加粗标题所在的行数 # 参考https://www.shouxicto.com/article/96876.html
    17. doc= Document(file)
    18. # 遍历每个段落并判断是否为空白行,如果有空白行,就删除
    19. for paragraph in doc.paragraphs:
    20. if not paragraph.text.strip():
    21. # 如果是空白行则将其从文档中移除
    22. p = paragraph._element
    23. p.getparent().remove(p)
    24. doc.save(path + r'\育婴师三级教育操作参考(去掉回车).docx')
    25. print('----2、读取word里面标题加粗段落的行数------')
    26. filename=path + r'\育婴师三级教育操作参考(去掉回车).docx'
    27. # 打开Word文档
    28. doc = Document(filename)
    29. d=len(doc.paragraphs)
    30. print(d)
    31. # docx没有去掉空行前,一共有258段文字
    32. # docx去掉空行后,一共有244段文字
    33. h=[]
    34. s=[]
    35. # 遍历文档中的段落
    36. for i, paragraph in enumerate(doc.paragraphs):
    37. if paragraph.runs:
    38. # 检查段落中的所有运行对象
    39. for run in paragraph.runs:
    40. if run.bold:
    41. # 如果运行对象的文字为加粗,则打印段落索引
    42. # print("段落", i, "的文字被加粗了")
    43. h.append(i)
    44. # 提取每一份的加粗标题
    45. t=doc.paragraphs[i].text
    46. # print(t)
    47. s.append(t)
    48. s=list(set(s))
    49. s.sort()
    50. # print(s)
    51. # ['3.1.1 运用发育诊断法对2岁婴儿的以不同步子行走能力进行测试', '3.1.2 为2岁婴儿编制规范、适宜的个别化游戏活动计划(5分钟)', '3.1.3 设计生活中婴儿动手自理的活动(5分钟)', '3.1.4 六个月以内
    52. # 的婴儿的精细动作的日常练习活动设计(5分钟)', '3.1.5 列举两种感统练习器械,并简述其活动功能(5分钟)', '3.2.1 请阐述对婴儿语言发展水平的观察与记录方法(5分钟)', '3.2.2 如何制定婴幼儿个别化
    53. # 语言培养计划(5分钟)', '3.2.3 设计一份记录表格,观察一个6个月左右的宝宝寻找不同声源的感知练习过程(5分钟)', '3.2.4 设计一个观察表,观察并调整婴儿在视动协调方面的练习(5分钟)', '3.2.5 设
    54. # 计一个观察表,记录孩子可能发生的行为(5分钟)', '3.3.1 如何对待任性的孩子(5分钟)', '3.3.2 如何对待爱哭的孩子(5
    55. # print(len(s))
    56. # 13
    57. h=list(set(h))
    58. h.sort()
    59. j=h[1:]
    60. j.append(d)
    61. print(h)
    62. print(len(h))
    63. print(j)
    64. print(len(j))
    65. # # 去掉空行前
    66. # # [1, 25, 48, 64, 77, 95, 117, 136, 158, 179, 200, 218, 238]
    67. # # 13
    68. # # [25, 48, 64, 77, 95, 117, 136, 158, 179, 200, 218, 238, 258]
    69. # # 13
    70. # # 去掉空行后
    71. # # [1, 23, 45, 60, 72, 89, 110, 127, 148, 168, 188, 205, 224]
    72. # # 13
    73. # # [23, 45, 60, 72, 89, 110, 127, 148, 168, 188, 205, 224, 244]
    74. print('----3、读取word里面标题加粗段落的行数+表格占的段落数------')
    75. # 拆分docx(读取加粗的行,这些行还要加上表格的行数)
    76. # 13张表格里面分别有几个表格
    77. bg=[2,1,0,1,1,1,1,1,1,1,0,0,0]
    78. # 第一张表是原来的段落数,所以就是0
    79. bg.insert(0,0)
    80. # print(bg)
    81. # 数字累加
    82. o = []
    83. sum = 0
    84. for num in bg:
    85. sum += num
    86. o.append(sum)
    87. print(o)
    88. # [0, 2, 3, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10]
    89. # # # 没有空行的内容
    90. print('----3、读取word里面标题加粗段落的行数+表格占的段落数------')
    91. # 拆分docx(读取加粗的行,这些行还要加上表格的行数)
    92. # 13张表格里面分别有几个表格
    93. imagePath1=path+r'\育婴师13题拆分'
    94. if not os.path.exists(imagePath1): # 判断存放图片的文件夹是否存在
    95. os.makedirs(imagePath1) # 若图片文件夹不存在就创建
    96. # for x in range(len(s)):
    97. # 获取第一页的段落和表格
    98. # a=int(j[x]+o[x])
    99. for x in range(len(s)):
    100. doc = Document(filename)
    101. first_page_paragraphs = []
    102. first_page_tables = []
    103. for element in doc.element.body:
    104. if element.tag.endswith(('}p', '}tbl')):
    105. if element.getparent().index(element) >int(j[x]+o[x]) :
    106. if element.tag.endswith('p'):
    107. first_page_paragraphs.append(element)
    108. else:
    109. first_page_tables.append(element)
    110. if element.getparent().index(element)<int(h[x]+o[x]):
    111. if element.tag.endswith('p'):
    112. first_page_paragraphs.append(element)
    113. else:
    114. first_page_tables.append(element)
    115. # print(int(j[x]+o[x]))
    116. # print(int(h[x]+o[x]))
    117. # 删除第一页的段落和表格
    118. for paragraph in first_page_paragraphs:
    119. p = paragraph.getparent()
    120. p.remove(paragraph)
    121. for table in first_page_tables:
    122. t = table.getparent()
    123. t.remove(table)
    124. # # 保存修改后的文档为新文件
    125. # doc.save(path+r'01.docx')
    126. doc.save(imagePath1+r'\{} {}.docx'.format('%02d'%x,s[x]))

    感悟:

    1、删除段落和表格:本篇用删除段落和表格的方式保留需要的段落部分

    后续思考:可以试试复制法——复制25-47的内容,清空文档,再黏贴25-47的内容,另存为。

    2、段落内包含表格占位,有点难办

    段落里有表格占位,这个很麻烦,如果有很多份操作题需要拆开,我不可能去看每套题目里面有几张表格,并做段落数累加。后续还要再研究段落数与表格在第几段上。

  • 相关阅读:
    hash 哈希表
    LaTeX中的积分符号
    MATLAB基础-MAT文件的读写操作
    Python基础篇(十二)-- 常用模块
    【面试题-Java】2022面试题干货汇总(持续更新)
    在字节跳动做了5年软件测试,12月无情被辞,想给划水的兄弟提个醒...
    算法题目中图和树的存储
    微软将JavaScript API引入 Excel
    【数据结构】优先级队列 - 堆
    住建部发话,9月15日后,全面禁止使用这9项施工工艺、设备和材料
  • 原文地址:https://blog.csdn.net/reasonsummer/article/details/136331041