python合并以及拆分word文档

1,048 阅读2分钟

python合并以及拆分word文档

python合并word文档

因为word文档存放到多个目录中,每个目录有且只有一个word文档。

这里对需求进行拆分

  1. 首先需要找到全部的word文档,并且复制到一个目录中
  2. 对目录中的所有word文档合并为一个word文档

搜索目标目录中所有的word文档并复制到对应目录中

from pathlib import Path
from shutil import copyfile

files = list()
for dir in Path(r"D:\xxx\xx\word_parse\words\words").iterdir():
    if dir.is_dir():
        for sub_dir in dir.iterdir():
            # print(sub_dir)
            if sub_dir.is_file():
                if sub_dir.suffix in [".doc", ".docx"]:
                    files.append(sub_dir)
            elif sub_dir.is_dir():
                for subsub_dir in sub_dir.iterdir():
                    if subsub_dir.is_file():
                        if subsub_dir.suffix in [".doc", ".docx"]:
                            files.append(subsub_dir)

save_path = Path(r"D:\xxx\xx\word_parse\data2")  # word文档存放目录

for file in files:
    # 对文件进行重命名
    employees_name = file.parent.name
    new_filename = f"{employees_name}_{employees_name}"
    new_path = save_path.joinpath(new_filename)
    copyfile(file, new_path)
                            

将目录中所有的word文档合并为一个word文档

import win32com.client as win32
import os
word = win32.gencache.EnsureDispatch('Word.Application')
#启动word对象应用
word.Visible = False
path = r"D:\project\work\word_parse\data2"
files = []
for filename in os.listdir(path):
    filename = os.path.join(path,filename)
    files.append(filename)
#新建合并后的文档
output = word.Documents.Add()
for file in files:
    output.Application.Selection.InsertFile(file)#拼接文档
#获取合并后文档的内容
doc = output.Range(output.Content.Start, output.Content.End)
output.SaveAs(r"D:\xxx\xx\word_parse\word_merge.docx") #保存,这里必须为docx后缀,不支持doc后缀
output.Close()

word文档拆分

这里需要对上述合并后的word文档进行拆分,按照段落进行拆分,以空行为分割线。

from docx.oxml.ns import qn
from pathlib import Path
import docx
import re



def get_year(items):
    ...
    return year


def save_new_doc(paragraph, year, name):
    data_path = Path(r"D:\xxx\xx\word_parse\data3")  # 拆分后的word文档存放路径
    file_name = f"{year}-{name}.docx"
    save_name = data_path.joinpath(file_name)
    doc_obj = docx.Document()
    doc_obj.add_paragraph()
    # 设置格式,中文的情况下如果不设置字体会导致中文显示异常
    run = doc_obj.paragraphs[0].add_run(paragraph.text)
    run.font.name = "Arial"
    run._element.rPr.rFonts.set(qn('w:eastAsia'),'仿宋_GB2312')  # 其他字体也可以,word文档中可以找到的字体应该都可以设置
    doc_obj.save(save_name)



# 获取输入文档对象,file_input_name为待读取文档文件
file = r"D:\xxx\xx\word_parse\word_merge.docx"
main_doc_obj = docx.Document(file)

for paragraph in main_doc_obj.paragraphs:
    # 查看段落样式
    # print(paragraph.style.name)
    # 查看段落文字
    # print(paragraph.text)
    context = paragraph.text
    # 每个段落末尾的回车后到下一个回车之间都算一个段落,如果当前段落只有一个回车(空行),实际读取的context不为空,为换行符(回车),所以这里需要做判断,排除掉空行,否则会导致异常
    if context == "\n":
        continue
    elif context:
        # 这里为具体的内容处理逻辑,可以不看
        items = context.split(",")
        if items:
            # 1. get name from items
            name = items[0]
            # 2. get year from items
            year = get_year(items)
            # 3. create new document object and save it
            save_new_doc(paragraph, year=year, name=name)
            print(f"save {name} successfully.")
        else:
            continue
    else:
        continue


到这里就结束了。