python批量修改doc文件

最近公司有个项目改名了,所以以前的文档也要全部修改。

大部分文档都需要改个名字,而大部分文档要修改的内容也是将文档的名字替换,此外就没了其他要修改的内容。

这样的情况下去一个一个操作文件时很费时间的,而且很容易出错。

恰好我现在正在学习python,而这些工作正是所python擅长的。所以我用python写了一个脚本文件解决了这些很繁杂的工作。

根据文档需要修改的文档的情况,有以下几件事是需要处理的:

  1. 列出当前文件夹下的所有文件;
  2. 将文件夹下所有文件的名字修改;
  3. 将所有doc文件里面的旧的项目名称替换为新的项目名字

根据上面的需求,脚本代码使用了一下的库:

  1. os:列举文件夹下的文件名称
  2. win32com:将doc格式的文件另存为docx格式的文件
  3. docx:修改docx里面的内容
  4. time:延时

下面我对各部分代码进行了解释。

1、引入要使用的库,定义了path和docx这两个变量

path是当前要操作的文件所在的文件夹,docx将doc格式文件另存为docx文件的保存目录

from docx import Document
import os
from win32com import client as wc
from time import sleep

path = 'D:/work' 
docx = 'D:/docx'

2、定义了类Mydocx
class Mydocx:
    """批量处理docx文件"""

    def __init__(self, old_info, new_info) -> None:
        """定义文件路径等"""

        self.old_info = old_info #docx文件里面要替换掉的内容
        self.new_info = new_info #docx文件里面新的内容
        self.path = str(path)    #替换文件所在的目录
3、使用os列出目录下的所有文件

因为python无法读取doc文件,而目录下的文件全是doc格式的,所以需要先将所有的文件另存为docx的文件在进行操作。为Mydocx这个类定义了一个方法get_files,用于列举目录下的所有的doc文件。这个方法用到了os模块的 listdir , listdir能列举目录下的所有文件的文件名。

    def get_files(self):
        """从文件夹路径获取文件列表"""

        files = []
        # 从文件夹路径获取文件列表,并剔除非doc格式的文件
        for file in os.listdir(self.path):
            if file.endswith('.doc'):
                files.append(file)
            else:
                print(file)
                
        # self.doc2docx(files)
4、win32com用来将doc格式的文件另存为docx格式的文件

使用win32com将所有的文件全部另存为docx格式文件,并保存的另一个目录docx(D:/docx) 下。

    def doc2docx(self, files):
        """doc转换docx"""
        
        循环保存文件为docx格式
        for file_name in files:

            word = wc.Dispatch('Word.Application')
            #目标名称
            docx_name = file_name.split('.')[0]+'.docx'
            path = u'%s/' % self.path + file_name
            
            docx_path = u'%s/' % docx + docx_name
            
            #存在同名的文件则跳出本次循环
            if os.path.exists(docx_path):
                print('exists')
                continue

            doc = word.Documents.Open(path)
            # 目标路径下的文件
            doc.SaveAs(docx_path, 12)
            doc.Close()
            word.Quit()
            sleep(2)
5、循环读取文件并修改里面的内容

读取目标文件替换里面的内容。

    def read(self, files):
        """读取所有文件"""
        for file in files:

            doc = Document(self.path+'/'+file)
            self.update(doc)
            doc.save(self.path+'/'+file)
            print("%s替换完成" % file)

    def update(self, doc):
        """替换文件内容"""

        # 读取所有段落里面的内容并替换
        for p in doc.paragraphs:
            for run in p.runs:
                run.text = run.text.replace(self.old_info, self.new_info)

        # 读取所有表格里面的内容并替换
        for table in doc.tables:
            for row in table.rows:
                for cell in row.cells:
                    cell.text = cell.text.replace(
                        self.old_info, self.new_info)  # 替换信息
6、修改文件名
    def rename(self, files):
        """批量修改文件名"""

        for file_name in files:
            oldname = '%s/' % self.path + file_name
            //去除文件里面的空格
            # newname = '%s/' % self.path + \
            #     file_name.replace(' ', '')
            newname = '%s/' % self.path + \
                file_name.replace(self.old_info, self.new_info)
            os.rename(oldname, newname)  # 用os模块中的rename方法对文件改名

下面是完整的代码:

from docx import Document
import os
from win32com import client as wc
from time import sleep

path = 'D:/work'
docx = 'D:/docx'

class Mydocx:
    """批量处理docx文件"""

    def __init__(self, old_info, new_info) -> None:
        """定义文件路径等"""

        self.old_info = old_info
        self.new_info = new_info
        self.path = str(path)

    def doc2docx(self, files):
        """doc转换docx"""

        for file_name in files:

            word = wc.Dispatch('Word.Application')

            docx_name = file_name.split('.')[0]+'.docx'
            path = u'%s/' % self.path + file_name
            docx_path = u'%s/' % docx + docx_name
            if os.path.exists(docx_path):
                print('exists')
                continue

            print(path)
            print(docx_path)

            doc = word.Documents.Open(path)
            # 目标路径下的文件
            doc.SaveAs(docx_path, 12)
            doc.Close()
            word.Quit()
            sleep(2)

    def rename(self, files):
        """批量修改文件名"""

        for file_name in files:
            oldname = '%s/' % self.path + file_name
            # newname = '%s/' % self.path + \
            #     file_name.replace(' ', '')
            newname = '%s/' % self.path + \
                file_name.replace(self.old_info, self.new_info)
            os.rename(oldname, newname)  # 用os模块中的rename方法对文件改名

    def get_files(self):
        """从文件夹路径获取文件列表"""

        files = []
        # 从文件夹路径获取文件列表,并剔除非docx格式的文件
        for file in os.listdir(self.path):
            if file.endswith('.docx'):
                files.append(file)
            else:
                print(file)
        print(len(files))
        # self.rename(files)
        # self.doc2docx(files)
        self.read(files)

    def read(self, files):
        """读取所有文件"""
        for file in files:

            doc = Document(self.path+'/'+file)
            self.update(doc)
            doc.save(self.path+'/'+file)
            print("%s替换完成" % file)

    def update(self, doc):
        """替换文件内容"""

        # 读取所有段落里面的内容并替换
        for p in doc.paragraphs:
            for run in p.runs:
                run.text = run.text.replace(self.old_info, self.new_info)

        # 读取所有表格里面的内容并替换
        for table in doc.tables:
            for row in table.rows:
                for cell in row.cells:
                    cell.text = cell.text.replace(
                        self.old_info, self.new_info)  # 替换信息


mydoc = Mydocx('原来的项目名称', '现在的项目名称')
mydoc.get_files()
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风云长轩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值