本文目录导读:

- 场景一:批量替换多个文件中的文本内容(如:把代码里的旧API名换成新API名)
- 场景二:批量替换文件名中的部分字符串(如:把「2024年1月.png」改为「2024年2月.png」)
- 场景三:批量替换 Excel/CSV 文件中的数据(如:把某列的数据统一替换)
- 使用建议
- 安全提示(非常重要)
是的,实用脚本完全可以实现批量替换功能,批量替换是脚本最擅长解决的场景之一,可以极大提高效率。
具体如何实现,取决于你要在什么文件或内容上进行替换,下面我按不同的需求和场景,给出几种常用的脚本方案(主要用Python和Shell脚本,因为它们在批量处理上最通用)。
批量替换多个文件中的文本内容(如:把代码里的旧API名换成新API名)
这是最常见的需求,比如你想把项目里所有 .txt 或 .py 文件中的 “old_version” 全部替换成 “0_version”。
Python 脚本示例:
import os
import re # 如果需要正则表达式
def batch_replace_in_files(root_dir, old_text, new_text, file_extension=".txt", use_regex=False):
"""
批量替换指定目录下所有特定扩展名文件中的文本
:param root_dir: 根目录路径
:param old_text: 要查找的旧文本
:param new_text: 要替换的新文本
:param file_extension: 文件扩展名,如 ".py", ".txt", ".md"
:param use_regex: 是否使用正则表达式模式匹配
"""
for foldername, subfolders, filenames in os.walk(root_dir):
for filename in filenames:
if filename.endswith(file_extension):
filepath = os.path.join(foldername, filename)
try:
with open(filepath, 'r', encoding='utf-8') as f:
content = f.read()
# 执行替换
if use_regex:
new_content = re.sub(old_text, new_text, content)
else:
new_content = content.replace(old_text, new_text)
# 如果内容有改动,才写回文件
if new_content != content:
with open(filepath, 'w', encoding='utf-8') as f:
f.write(new_content)
print(f"已替换: {filepath}")
except Exception as e:
print(f"处理文件 {filepath} 时出错: {e}")
# 使用示例:将 ./my_project 目录下所有 .py 文件里 'Foo' 替换为 'Bar'
batch_replace_in_files("./my_project", "Foo", "Bar", file_extension=".py")
Shell 脚本(Linux/macOS 推荐,使用 sed):
#!/bin/bash
# 批量替换当前目录下所有 .txt 文件中的 old_text 为 new_text
# 注意:macOS 上 sed 需要加 '' 作为备份后缀,Linux 不需要
# 方法1: 使用 find + sed (最安全,支持递归目录)
find ./ -type f -name "*.txt" -exec sed -i 's/old_text/new_text/g' {} +
# 方法2: 直接在脚本中写
old="old_version"
new="new_version"
for file in *.txt; do
if [ -f "$file" ]; then
sed -i "s/$old/$new/g" "$file"
echo "已替换: $file"
fi
done
批量替换文件名中的部分字符串(如:把「2024年1月.png」改为「2024年2月.png」)
Python 脚本示例:
import os
def batch_rename_files(directory, old_section, new_section):
"""
批量重命名文件,替换文件名中的特定字符串
"""
for filename in os.listdir(directory):
if old_section in filename:
new_filename = filename.replace(old_section, new_section)
old_path = os.path.join(directory, filename)
new_path = os.path.join(directory, new_filename)
os.rename(old_path, new_path)
print(f"重命名: {filename} -> {new_filename}")
# 使用示例:将当前目录下所有文件名中的 "2024年1月" 改为 "2024年2月"
batch_rename_files("./", "2024年1月", "2024年2月")
Shell 脚本(Linux/macOS):
#!/bin/bash
# 批量重命名当前目录下所有 .jpg 文件,将 'photo_' 前缀改为 'image_'
for f in *photo_*.jpg; do
mv "$f" "${f/photo_/image_}"
done
批量替换 Excel/CSV 文件中的数据(如:把某列的数据统一替换)
Python 脚本(使用 pandas):
import pandas as pd
import os
def batch_replace_in_csv(directory, old_value, new_value, column_name=None):
"""
批量替换CSV文件中的单元格值
:param column_name: 如果指定,只替换该列;否则替换所有单元格
"""
for filename in os.listdir(directory):
if filename.endswith(".csv"):
filepath = os.path.join(directory, filename)
df = pd.read_csv(filepath)
if column_name:
if column_name in df.columns:
df[column_name] = df[column_name].replace(old_value, new_value)
else:
df = df.replace(old_value, new_value)
df.to_csv(filepath, index=False)
print(f"已处理: {filename}")
使用建议
| 场景 | 推荐工具/脚本 | 理由 |
|---|---|---|
| 少量文件,一次性的文本替换 | 用 VS Code / Sublime 等编辑器的「在文件中查找替换」功能 | 可视化,安全 |
| 大量文件,需要复杂的正则 | Python 脚本 (用 re 模块) |
灵活,保证编码处理 |
| Linux 服务器上快速处理 | Shell + sed | 无需安装环境,速度快 |
| 需要替换二进制文件中的字节 | Python (以 rb/wb 模式读写) |
二进制安全 |
| 替换特定格式文件 (Word, PDF, Excel) | Python + python-docx / PyPDF2 / openpyxl |
专业库解析格式 |
安全提示(非常重要)
- 先备份:在正式运行前,把要被替换的文件复制一份到备份文件夹。
- 先测试:用
dry_run=True参数(自己实现),只打印结果,不实际修改。 - 确认编码:文件编码不统一时(如GBK和UTF-8混用),先用Python识别编码(可用
chardet库)再操作。
是的,实用脚本可以批量替换,而且针对不同需求(文本替换、文件名替换、特定格式文件替换)有非常成熟的套路。 如果你能告诉我具体的替换场景(比如替换什么类型的文件、替换规则是什么),我可以给你一个更精准的脚本。