【办公类-05】VS Python批量修改docx的文件名(周计划)

办公需求

最近在做常规资料(周计划、信息窗、主题知识、育儿知识)的批量模版。当我把信息窗和主题知识的20周内容批量生成后,花了两个小时把里面的信息窗内容进行微调(这是一套3年前的信息窗,部分内容已经不适宜现在的后疫情环境)。

 

改完后突然发现每周word文件名写错了——我写成了"第3周信息窗育儿知识(大八班下学期)”,正确的写法是了"第3周信息窗主题知识(大八班下学期)”

解决思路

由于20分word里面的内容已经手动修改过大量文字(并非从excel模板里调用的原始内容),所以我有两个选择:

第一:打开每一份被生成的信息窗word,按周次,把更新的内容再次贴入excel相应位置内。然后修改代码里面的批量文件名,最后运行一次。就可以获得"第3周信息窗主题知识(大八班下学期)‘’的文件名。(把正确内容贴入excel,可以反复调整。)

第二,直接通过Python代码,把已经生成20个信息窗word批量改成新的文件名。

处理方法:

为了快速更改,我还是去搜索了“word批量改文件名的代码”,Risun_Lee的多功能代码,快速将我的20个"第x周信息窗育儿知识(大八班下学期).docx”,1秒在替换成了20篇"第X周信息窗主题知识(大八班下学期),非常实用。

代码:计划word批量修改docx的文件名

'''
作者:Risun_Lee
原地址:https://www.cnblogs.com/risunlee/p/13630526.html
'''


# system module
import os
import re
import tkinter
import tkinter.messagebox
import tkinter.filedialog
import tkinter.ttk
import sys
import logging

logger = logging.getLogger(__name__)

def create_logger(filename="log.txt", level=logging.INFO, console_swtich = True):
    # 获取logger实例,如果参数为空则返回root logger
    # logger = logging.getLogger(__name__)

    # 创建日志输出格式
    formatter = logging.Formatter("%(asctime)s - %(filename)s[line:%(lineno)d][%(funcName)s] - %(levelname)s - %(message)s")

    # 指定输出的文件路径
    file_handler = logging.FileHandler(filename)
    # 设置文件处理器格式
    file_handler.setFormatter(formatter)

    # 为logger添加的日志处理器
    logger.addHandler(file_handler)

    # 控制台日志
    if console_swtich:
        console_handler = logging.StreamHandler(sys.stdout)
        console_handler.formatter = formatter
        logger.addHandler(console_handler)

    # 指定日志的最低输出级别,默认为warn级别
    logger.setLevel(level)

    return logger

class modify_string():
    #界面布局方法
    def __init__(self):
        #创建界面,并且保存到成员属性中
        self.root = tkinter.Tk()
        self.root.minsize(400, 170)
        self.root.resizable(0, 0)
        self.root.title("批量修改字符串")

        #文件夹路径
        self.path = tkinter.StringVar()
        self.path.set("")

        #选项
        self.folder_name = tkinter.IntVar()
        self.file_name = tkinter.IntVar()
        self.file_content = tkinter.IntVar()

        #字符串
        self.string_old = tkinter.StringVar()
        self.string_new = tkinter.StringVar()

        #进度
        self.progress = tkinter.StringVar()
        self.progress.set("开始修改")

        #界面布局
        self.menus()
        self.layout()
        self.root.mainloop()

    def menus(self):
        #添加菜单

        #创建总菜单
        allmenu = tkinter.Menu(self.root)

        # 添加子菜单1
        debugmenu = tkinter.Menu(allmenu, tearoff=0)
        debugmenu.add_command(label="日志",
                              command=self.log)

        allmenu.add_cascade(label="调试",
                            menu=debugmenu)

        # 添加子菜单2
        helpmenu = tkinter.Menu(allmenu, tearoff=0)

        # 添加选项卡
        helpmenu.add_command(label='规则',
                             command=self.rule)
        helpmenu.add_command(label='版本说明',
                             command=self.release_note)
        helpmenu.add_command(label='关于',
                             command=self.about)

        allmenu.add_cascade(label='帮助',
                            menu=helpmenu)

        tkinter.ttk.Separator(self.root, orient="horizontal").pack(fill="x", padx=0)


        self.root.config(menu=allmenu)

    def layout(self):
        #布局
        #文件夹路径
        path_description = tkinter.Label(self.root,
                                         font=("宋体", 10),
                                         fg="blue",
                                         anchor="w",
                                         text="文件夹路径")
        path_description.place(x=5, y=10, width=70, height=20)

        path_show = tkinter.Label(self.root,
                                  bd=3,
                                  bg='white',
                                  font=("宋体", 10),
                                  anchor="e",
                                  textvariable=self.path)
        path_show.place(x=80, y=10, width=250, height=20)

        button_path = tkinter.Button(self.root,
                                     text='选择',
                                     command=self.select_path)
        button_path.place(x=335, y=10, width=60, height=20)

        # 选项
        option = tkinter.Label(self.root,
                               font=("宋体", 10),
                               fg="blue",
                               anchor="w",
                               text="修改选项")
        option.place(x=5, y=40, width=70, height=20)

        folder_select =tkinter.Checkbutton(self.root,
                                           text="文件夹名称",
                                           anchor="w",
                                           variable=self.folder_name)
        folder_select.place(x=80, y=40, width=100, height=20)

        folder_select = tkinter.Checkbutton(self.root,
                                            text="文件名称",
                                            anchor="w",
                                            variable=self.file_name)
        folder_select.place(x=185, y=40, width=100, height=20)

        folder_select = tkinter.Checkbutton(self.root,
                                            text="文件内容",
                                            anchor="w",
                                            variable=self.file_content)
        folder_select.place(x=290, y=40, width=100, height=20)

        #字符串
        tkinter.Label(self.root,
                      font=("宋体", 10),
                      fg="blue",
                      anchor="w",
                      text="原字符串").place(x=5, y=70, width=70, height=20)
        source_text = tkinter.Entry(self.root,
                                    textvariable=self.string_old)
        source_text.place(x=80, y=70, width=310, height=20)

        tkinter.Label(self.root,
                      font=("宋体", 10),
                      fg="blue",
                      anchor="w",
                      text="新字符串").place(x=5, y=100, width=70, height=20)
        source_text = tkinter.Entry(self.root,
                                    textvariable=self.string_new)
        source_text.place(x=80, y=100, width=310, height=20)

        # 开始修改
        button_start = tkinter.Button(self.root,
                                      font=("宋体", 12),
                                      text="开始修改",
                                      command=self.start)
        button_start.place(x=165, y=130, width=70, height=30)

    def matchcase(self, word):
        return word
        # def rmodify(m):
        #     # re.sub会将匹配到的对象,循环调用modify方法传入
        #
        #     # 获取匹配的文本
        #     text = m.group()
        #
        #     if text.isupper():
        #         # 如果文本全部是大写,就返回word的全部大写模式
        #         return word.upper()
        #     elif text.islower():
        #         # 如果文本全部是小写,就返回word的全部小写模式
        #         return word.lower()
        #     elif len(text) > 0 and text[0].isupper():
        #         # 如果文本是首字母大写,就返回word的首字母大写模式
        #         return word.capitalize()
        #     else:
        #         # 其他情况,直接返回word
        #         return word
        #
        # return modify

    def modify(self, path):
        # 修改当前文件夹名称
        if self.folder_name.get() == 1:
            folder = os.path.basename(path)
            folder = re.sub(self.string_old.get(),
                            self.matchcase(self.string_new.get()),
                            # flags=re.IGNORECASE,
                            folder)
            os.rename(path, os.path.join(os.path.dirname(path), folder))
            path = os.path.join(os.path.dirname(path), folder)

        filenames = os.listdir(path)
        logger.info(f"file list {filenames}")

        for filename in filenames:
            domain = os.path.abspath(path)
            file_path = os.path.join(domain, filename)

            # 递归修改子文件名称、文件名称、文件内容
            if os.path.isdir(file_path):
                if self.folder_name.get() == 1:
                    filename = re.sub(self.string_old.get(),
                                      self.matchcase(self.string_new.get()),
                                      # flags=re.IGNORECASE,
                                      filename)
                    os.rename(file_path, os.path.join(domain, filename))
                    file_path = os.path.join(domain, filename)

                logger.debug(f"enter folder {file_path}")
                self.modify(file_path)
                logger.debug(f"exit folder {file_path}\n")
                continue

            # 修改文件名称
            if self.file_name.get() == 1:
                filename = re.sub(self.string_old.get(),
                                 self.matchcase(self.string_new.get()),
                                  # flags=re.IGNORECASE,
                                 filename)
                os.rename(file_path, os.path.join(domain, filename))
                file_path = os.path.join(domain, filename)

            # 修改文件内容
            if self.file_content.get() == 1:
                format = file_path.split(".")[-1]
                if format != "c" and format != "h" and format != "txt":
                    logger.info(f"can not process {file_path}")
                    continue;

                fread = open(file_path, 'r')
                fwrite = open("%s.backup" % file_path, 'w')

                while True:
                    line = fread.readline()
                    if len(line) > 0:
                        line = re.sub(self.string_old.get(),
                                      self.matchcase(self.string_new.get()),
                                      # flags=re.IGNORECASE,
                                      line)
                        fwrite.write(line)
                    else:
                        break
                fread.close()
                fwrite.close()
                os.remove(file_path)
                os.rename("%s.backup" % file_path, file_path)

    def start(self):
        if self.path.get() == "":
            tkinter.messagebox.showinfo('错误', "请选择文件夹路径!")
        else:
            logger.info(f'''路径:"{self.path.get()}"''')
            logger.info("修改选项:")
            option_count = 0
            if self.folder_name.get() == 1:
                option_count = option_count + 1
                logger.info(f"  {option_count}. 文件夹名称")
            if self.file_name.get() == 1:
                option_count = option_count + 1
                logger.info(f"  {option_count}. 文件名称")
            if self.file_content.get() == 1:
                option_count = option_count + 1
                logger.info(f"  {option_count}. 文件内容")
            logger.info(f"原字符串:{self.string_old.get()}")
            logger.info(f"新字符串:{self.string_new.get()}")
            self.modify(self.path.get())
            tkinter.messagebox.showinfo('结果', "修改完成")

    def log(self):
        os.startfile("log.txt")
        # domain = os.path.abspath(os.getcwd())
        # log_path = os.path.join(domain, "log")
        #
        # log = open(log_path, 'r')
        # log.close()

    def rule(self):
        tkinter.messagebox.showinfo('批量修改字符串规则',
                                    "1.修改当前文件夹及子文件夹的名称;\n"
                                    "2.修改当前文件夹及子文件夹下所有文件的名称;\n"
                                    "3.修改当前文件夹及子文件夹下所有文件的内容;\n")

    def about(self):
        tkinter.messagebox.showinfo('批量修改字符串',
                                    "作者:Risun_Lee\n"
                                    "版本: V1.0\n"
                                    "发布日期: 2020年9月8日\n")

    def release_note(self):
        tkinter.messagebox.showinfo('版本说明',
                                    "V1.0:\n"
                                    "1.支持文件夹名称、文件名称的修改;\n"
                                    "2.支持txt、c、h文件内容的修改;\n")

    def select_path(self):
        path = tkinter.Tk()
        path.withdraw()
        fpath = os.path.normpath(tkinter.filedialog.askdirectory())
        if fpath != ".":
            self.path.set(str(fpath))

def main():
    create_logger(level=logging.DEBUG)
    modify_string()

if __name__ == '__main__':
    main()

操作过程:

 选择文件夹位置--关键词和替换后-开始转换- 替换效果展示

 最后的效果

 此代码还可以应用于修改word文件内容,把把20份word里面的文字替换内容,加粗等。

非常实用的代码!!!




 

这个代码还可以把.docx改成.xlsx或者JPG格式。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值