Python批量替换Excel和Word中的关键字

本文介绍了一种使用Python编程解决在多个Excel和Word文件中批量替换关键字的问题,同时保持原格式并删除源文件的方法。文章详细描述了遍历文件、读取替换表、处理docx和xlsx文件的步骤以及注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、问题的提出

有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉。因为这么多文件,要一个一个地打开文件,再进行批量替换修改,几个文件还好,如果是成百上千的文件,我想你一会儿就感觉自己被搞晕了,不仅搞不清修改了没有修改完,而且已经修改的也不知道修改的彻底不。

于是,问题来了,当我需要对多个Excel和Word文件中的关键字进行替换,而且不改变原文件的格式,同时删除源文件,我们该怎么办?这些office文件可能分布在不同的文件夹下,所以替换后还要存放在原来的文件夹。同时,我们编写的程序还要在Windows和MacOS环境下都可以使用。

二、算法分析

由于要在多个环境下使用,我们放弃VBA,考虑采用Python编程的方法来解决。

1. 第一步 读取一个替换关键字的"批量替换表.xlsx"生成一个字典,这样是为了后面可以批量替换。第二步 遍历当前目录下所有目录包括上当的文件,主要是docx和xlsx文件,如果是doc和xls文件,还要考虑两这两种格式的文件进行批量的转化,见下面的文章 。

批量转doc和xls为docx和xlsx文件

2. 第二步是 遍历当前所有目录中的文件,用if条件,根据文件扩展名的不同来筛选出docx和xlsx文件。代码如下:

    for root, filefolder, files in os.walk(os.curdir):
        for file in files:
            if file.endswith("docx"):
                file_path = os.path.join(root, file)
                for key, value in dic.items():
                    word_replace_keywords(file_path, key, value)
            elif file.endswith("xlsx") and os.path.basename(file)!="批量替换表.xlsx":
                file_path = os.path.join(root, file)
                for key, value in dic.items():
                    excel_replace_keywords(file_path, key, value)

3. 第三步是对于docx和xlsx文件分别进行替换处理,主要采用了python-docx和openpyxls这两个模块来进行替换。针对docx文件,我们用Document()来读取,用以下代码来替换:

def info_update(doc, old, new):
    for para in doc.paragraphs:
        for run in para.runs:
            if old in run.text:
                run.text = run.text.replace(old, new)

对于xlsx文件我,我们通过下面的代码实现关键字替换,同时不改变原来关键字的格式。

def replace_cell_text_with_format(cell, keyword, replacement):
    paragraphs = cell.paragraphs
    for paragraph in paragraphs:
        for run in paragraph.runs:
            if keyword in run.text:
                new_text = run.text.replace(keyword, replacement)
                run.clear()  # 清除当前文本
                new_run = run._element  # 创建新的run
                new_run.text = new_text  # 设置新文本
                for key in run._r.attrib.keys():  # 复制格式属性
                    if key != 't':
                        new_run.attrib[key] = run._r.attrib[key]

4. 第四步 我们要保存替换后的文件,同时用os.remove()删除原来的文件。

三、代码展示

最终,我们编制出70多行的代码,一键实现了多文件、多关键字、保存源格式,又能在Windows和苹果电脑环境使用的程序。代码如下:

import os
from docx import Document
from openpyxl import load_workbook

def info_update(doc, old, new):
    for para in doc.paragraphs:
        for run in para.runs:
            if old in run.text:
                run.text = run.text.replace(old, new)
                
def replace_cell_text_with_format(cell, keyword, replacement):
    paragraphs = cell.paragraphs
    for paragraph in paragraphs:
        for run in paragraph.runs:
            if keyword in run.text:
                new_text = run.text.replace(keyword, replacement)
                run.clear()  # 清除当前文本
                new_run = run._element  # 创建新的run
                new_run.text = new_text  # 设置新文本
                for key in run._r.attrib.keys():  # 复制格式属性
                    if key != 't':
                        new_run.attrib[key] = run._r.attrib[key]
def get_dic():
    workbook = load_workbook('批量替换表.xlsx')
    sht = workbook.active
    dic = {}
    for c1,c2 in zip(sht["A"],sht["B"]):
        if c1.value!= None and c2.value!= None:
            dic[c1.value] = c2.value
    return dic

def word_replace_keywords(file_path, keyword, replacement):
    doc = Document(file_path)
    info_update(doc, keyword, replacement)
    try: 
        for table in doc.tables:
            if not any(cell.text for row in table.rows for cell in row.cells):
                continue  
            for row in table.rows:
                for cell in row.cells:
                    if keyword in cell.text:
                        replace_cell_text_with_format(cell, keyword, replacement)
    except Exception as e:
        print("Error processing table:", e)
            
    doc.save(file_path)

def excel_replace_keywords(file_path, keyword, replacement):
    wb = load_workbook(file_path)
    for sheet_name in wb.sheetnames:
        sheet = wb[sheet_name]
        for row in sheet.iter_rows():
            for cell in row:
                if cell.value and keyword in str(cell.value):
                    cell.value = str(cell.value).replace(keyword, replacement)
    wb.save(file_path)
    wb.close()
    
def get_replaced(dic):    
    for root, filefolder, files in os.walk(os.curdir):
        for file in files:
            if file.endswith("docx"):
                file_path = os.path.join(root, file)
                for key, value in dic.items():
                    word_replace_keywords(file_path, key, value)
            elif file.endswith("xlsx") and os.path.basename(file)!="批量替换表.xlsx":
                file_path = os.path.join(root, file)
                for key, value in dic.items():
                    excel_replace_keywords(file_path, key, value)
def main():
    dic = get_dic()
    get_replaced(dic)
if __name__ == "__main__":
    main()

以上代码的优势在于:速度快,设置好关键字后一键替换,可以在多个环境下使用,相比VBA代码,Python代码的执行速度更快、操作更简单、省时省力。

四、注意事项

1. 运行代码前一定要安装Python3.9及以上版本,同时安装openpyxl和python-docx两个模块。

2. 执行程序前要把doc和xls文件分别转化为docx和xlsx文件,这样更方便替换。

3. 执行前要在程序文件目录下建立一个xlsx文件,命名为"批量替换表.xlsx",在表的A列放上要查找的关键字,B列放要替换的关键字。

4. 如果有问题,可以随时与我联系,也可以通过下面进行提问。

<think>好的,我现在需要帮助用户解决如何用Python脚本替换txt文件中的关键字并保存到新文件的问题。首先,我得仔细分析用户的需求。用户提到了替换关键字,同时可能希望保留原有格式,但因为是txt文件,格式处理相对简单,不像WordExcel那样复杂。不过,用户提供的参考引用中有处理ExcelWord保留格式的例子,可能需要注意是否需要类似处理,但txt通常没有格式,所以重点可能在于正确替换文本内容。 接下来,我需要考虑用户可能的背景。用户可能对Python有一定了解,但可能不熟悉文件处理字符串替换的具体方法。用户的需求明确,但可能需要一个简单直接的解决方案,不需要复杂的库或额外安装模块。因此,我应该提供一个基础的脚本,使用Python内置功能来实现。 首先,我需要确定如何读取txt文件。Python中使用`open`函数,以读取模式打开文件,然后使用`read()`方法读取全部内容,或者逐行读取。替换关键字的话,可以用字符串的`replace`方法,或者正则表达式`re.sub`,后者更灵活,可以处理大小写不敏感或更复杂的模式。但用户的问题中提到的是直接替换关键字,可能不需要正则表达式,所以`replace`方法可能更简单。 然后,替换后的内容需要保存到新文件。这一步同样使用`open`函数,以写入模式打开新文件,写入处理后的内容。需要注意的是文件的编码问题,通常使用`utf-8`,但可能需要根据源文件的编码进行调整,比如`gbk`等。用户提供的引用中提到处理txt文件时可能涉及编码转换,比如引用[2]中用户将其他格式转为txt,所以可能需要提醒用户注意编码一致性,避免乱码。 接下来,考虑如何结构化代码。定义一个函数来处理替换,这样方便重用。函数参数包括输入文件路径、输出文件路径、旧关键字关键字。然后,读取输入文件内容,替换所有旧关键字为新关键字,再写入输出文件。这个过程需要处理文件的打开关闭,确保资源正确释放,使用`with`语句可以自动处理。 测试案例部分,用户可能需要示例来验证脚本的正确性。给出一个简单的例子,比如创建测试文件,运行脚本后检查结果是否正确。同时,提醒用户注意路径问题,比如文件是否存在,是否有读写权限等。 另外,用户提供的引用中有处理保留格式的例子,比如在Excel中使用`replace_cell_text_with_format`函数,但txt没有格式,所以这部分不需要处理。不过,可能需要提到如果替换需要更复杂的模式(如大小写不敏感、部分匹配),可以考虑使用正则表达式,并给出示例代码。 可能的扩展功能包括批量处理多个文件,使用`glob`模块遍历目录下的所有txt文件;或者统计替换次数,通过`replace`方法的返回值或正则表达式匹配次数来实现。这些可以作为相关问题提出,帮助用户进一步探索。 最后,需要检查代码是否符合Python语法,比如正确的缩进,正确的函数调用,文件操作是否正确。确保示例代码可以直接运行,不会出现错误。同时,提醒用户注意编码问题,避免因编码不一致导致的错误,比如UnicodeDecodeError,可以建议在`open`函数中添加`encoding='utf-8'`参数。 总结步骤:读取文件内容,替换关键字,写入新文件。代码结构简单,但需要涵盖基本错误处理,比如文件不存在的情况,但用户的问题可能不需要复杂错误处理,所以保持代码简洁,必要时添加注释说明可能的问题点。 现在,整理思路,写出分步的解决方案,并提供示例代码相关问题。</think>以下是使用Python脚本替换txt文件中关键字并保存到新文件的逐步解决方案: ### 一、基础实现方法 1. **读取原始文件** 使用`with open()`语句保证文件正确关闭: ```python def replace_keywords(input_file, output_file, old_str, new_str): with open(input_file, 'r', encoding='utf-8') as f: content = f.read() ``` 2. **执行替换操作** 使用字符串的`replace()`方法实现简单替换: ```python new_content = content.replace(old_str, new_str) ``` 3. **写入新文件** 将处理后的内容保存到新文件: ```python with open(output_file, 'w', encoding='utf-8') as f: f.write(new_content) ``` ### 二、完整代码示例 ```python def replace_keywords(input_file, output_file, old_str, new_str): # 读取文件内容 with open(input_file, 'r', encoding='utf-8') as f: content = f.read() # 执行替换 new_content = content.replace(old_str, new_str) # 写入新文件 with open(output_file, 'w', encoding='utf-8') as f: f.write(new_content) # 使用示例 replace_keywords('input.txt', 'output.txt', '旧关键字', '新关键字') ``` ### 三、增强功能建议 1. **正则表达式替换** 处理复杂模式时使用`re`模块: ```python import re def regex_replace(input_file, output_file, pattern, replacement): with open(input_file, 'r', encoding='utf-8') as f: content = f.read() new_content = re.sub(pattern, replacement, content, flags=re.IGNORECASE) with open(output_file, 'w', encoding='utf-8') as f: f.write(new_content) ``` 2. **批量处理多个文件** 结合`glob`模块实现批量操作: ```python import glob for filepath in glob.glob('*.txt'): replace_keywords(filepath, f'new_{filepath}', 'old', 'new') ``` ### 四、注意事项 1. 编码问题建议统一使用`utf-8`,如遇中文乱码可尝试`encoding='gbk'` 2. 原文件与目标文件路径需要正确设置 3. 大文件处理建议使用流式读取(逐行处理)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

PythonFun

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

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

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

打赏作者

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

抵扣说明:

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

余额充值