python合并以及拆分word文档
python合并word文档
因为word文档存放到多个目录中,每个目录有且只有一个word文档。
这里对需求进行拆分
- 首先需要找到全部的word文档,并且复制到一个目录中
- 对目录中的所有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
到这里就结束了。