1. 为什么需要批量重命名文件?
在日常工作中,我经常遇到需要处理大量文件重命名的情况。比如摄影师整理数百张照片、程序员管理项目文档、行政人员归档报表等场景。手动一个个修改不仅效率低下,还容易出错。Python作为一门强大的脚本语言,正好能完美解决这个痛点。
我最早接触这个需求是在处理一个摄影项目时,相机生成的图片文件名都是"DSC00123.jpg"这样的格式。要给300多张照片按照"项目名称_日期_序号"的格式重命名,手动操作简直是一场噩梦。后来我用Python写了个不到20行的脚本,3秒钟就搞定了这个原本需要半小时的工作。
2. 环境准备与基础工具
2.1 Python环境配置
首先确保你的系统已经安装了Python 3.6+版本。我推荐使用Anaconda来管理Python环境,它内置了很多常用的数据科学库,而且环境隔离做得很好。安装完成后,可以通过以下命令检查版本:
bash复制python --version
如果系统中有多个Python版本,可能需要使用python3命令:
bash复制python3 --version
2.2 必备库介绍
实现文件批量重命名主要用到Python内置的os和pathlib库,不需要额外安装:
- os模块:提供操作系统相关功能,特别是文件系统操作
- pathlib模块:面向对象的文件系统路径操作(Python 3.4+)
对于更复杂的需求,可能还需要:
- glob:文件模式匹配
- re:正则表达式支持
- shutil:高级文件操作
3. 基础重命名方案实现
3.1 最简单的单文件重命名
我们先从最基础的单个文件重命名开始,了解核心原理:
python复制import os
old_name = "old_file.txt"
new_name = "new_file.txt"
os.rename(old_name, new_name)
这个简单的例子展示了重命名的本质:调用os.rename()函数,传入旧文件名和新文件名即可。
注意:执行前确保文件存在,且新文件名不与其他文件冲突,否则会报错。
3.2 批量重命名基础版
接下来我们实现批量处理一个目录下的所有文件:
python复制import os
folder_path = "./documents" # 目标文件夹路径
file_list = os.listdir(folder_path) # 获取文件列表
for i, filename in enumerate(file_list):
# 构造新文件名:file_1, file_2...
new_name = f"file_{i+1}{os.path.splitext(filename)[1]}"
# 完整的旧文件路径和新文件路径
old_file = os.path.join(folder_path, filename)
new_file = os.path.join(folder_path, new_name)
os.rename(old_file, new_file)
这个脚本会把"documents"文件夹下的所有文件重命名为"file_1.ext"、"file_2.ext"这样的格式,保留原始文件扩展名。
4. 高级重命名技巧
4.1 使用正则表达式模式匹配
实际工作中,我们经常需要基于特定模式重命名。比如把"IMG_20230501_123456.jpg"改为"2023-05-01.jpg":
python复制import os
import re
folder_path = "./photos"
pattern = r"IMG_(\d{4})(\d{2})(\d{2})_\d+\.jpg"
for filename in os.listdir(folder_path):
match = re.match(pattern, filename)
if match:
year, month, day = match.groups()
new_name = f"{year}-{month}-{day}.jpg"
os.rename(
os.path.join(folder_path, filename),
os.path.join(folder_path, new_name)
)
4.2 保留原始扩展名的方法
在处理多种文件类型时,正确保留扩展名很重要:
python复制import os
filename = "document.2023.final.docx"
name, ext = os.path.splitext(filename)
# name = "document.2023.final"
# ext = ".docx"
4.3 处理文件名冲突
当新文件名已存在时,我们需要处理冲突:
python复制import os
from pathlib import Path
def safe_rename(old_path, new_path):
"""安全重命名,避免覆盖现有文件"""
if not os.path.exists(new_path):
os.rename(old_path, new_path)
else:
base = Path(new_path).stem
ext = Path(new_path).suffix
counter = 1
while True:
new_name = f"{base}_{counter}{ext}"
new_path = os.path.join(os.path.dirname(new_path), new_name)
if not os.path.exists(new_path):
os.rename(old_path, new_path)
break
counter += 1
5. 实战案例解析
5.1 摄影师照片整理脚本
假设你是一个摄影师,需要将相机生成的混乱文件名整理为有意义的名称:
python复制import os
import datetime
from PIL import Image
from PIL.ExifTags import TAGS
def get_image_date(image_path):
"""从图片EXIF信息获取拍摄日期"""
try:
img = Image.open(image_path)
exif = img._getexif()
if exif:
for tag, value in exif.items():
decoded = TAGS.get(tag, tag)
if decoded == "DateTimeOriginal":
return datetime.datetime.strptime(value, "%Y:%m:%d %H:%M:%S")
except Exception:
pass
return datetime.datetime.fromtimestamp(os.path.getmtime(image_path))
def rename_photos(folder):
for filename in os.listdir(folder):
if filename.lower().endswith(('.jpg', '.jpeg', '.png')):
old_path = os.path.join(folder, filename)
date = get_image_date(old_path)
new_name = f"{date.strftime('%Y%m%d_%H%M%S')}{os.path.splitext(filename)[1]}"
new_path = os.path.join(folder, new_name)
os.rename(old_path, new_path)
rename_photos("./photo_album")
这个脚本会:
- 尝试从照片EXIF信息中读取拍摄日期
- 如果失败则使用文件修改日期
- 将照片重命名为"YYYYMMDD_HHMMSS.ext"格式
5.2 项目文档批量编号
为项目文档添加统一前缀和序号:
python复制import os
def rename_project_files(folder, project_name):
files = [f for f in os.listdir(folder) if os.path.isfile(os.path.join(folder, f))]
files.sort() # 按文件名排序
for i, filename in enumerate(files, 1):
ext = os.path.splitext(filename)[1]
new_name = f"{project_name}_{i:03d}{ext}"
os.rename(
os.path.join(folder, filename),
os.path.join(folder, new_name)
)
rename_project_files("./project_docs", "Web_Redesign")
6. 常见问题与解决方案
6.1 文件名编码问题
处理包含非ASCII字符的文件名时,可能会遇到编码错误:
python复制import os
import sys
def safe_listdir(path):
"""安全获取目录列表,处理编码问题"""
try:
return os.listdir(path)
except UnicodeDecodeError:
if sys.platform == "win32":
return os.listdir(path.encode('utf-8').decode('mbcs'))
else:
return os.listdir(path.encode('utf-8').decode('utf-8'))
6.2 处理只读文件
在Windows上可能会遇到只读文件无法重命名的问题:
python复制import os
import stat
def make_writable(path):
"""移除文件的只读属性"""
if os.path.exists(path):
os.chmod(path, stat.S_IWRITE)
6.3 日志记录与回滚
重要的批量操作应该记录日志,以便出错时可以回滚:
python复制import os
import json
from datetime import datetime
def logged_rename(folder):
log_file = "rename_log.json"
log = []
for filename in os.listdir(folder):
old_path = os.path.join(folder, filename)
new_name = f"renamed_{filename}"
new_path = os.path.join(folder, new_name)
try:
os.rename(old_path, new_path)
log.append({
"timestamp": datetime.now().isoformat(),
"old_name": old_path,
"new_name": new_path,
"status": "success"
})
except Exception as e:
log.append({
"timestamp": datetime.now().isoformat(),
"old_name": old_path,
"error": str(e),
"status": "failed"
})
with open(log_file, "w") as f:
json.dump(log, f, indent=2)
7. 进阶技巧与优化
7.1 多线程加速处理
处理大量文件时,可以使用多线程提高速度:
python复制import os
import concurrent.futures
def rename_file(args):
old_path, new_path = args
try:
os.rename(old_path, new_path)
return True
except Exception:
return False
def batch_rename(folder):
files = os.listdir(folder)
rename_tasks = []
for i, filename in enumerate(files, 1):
old_path = os.path.join(folder, filename)
new_path = os.path.join(folder, f"file_{i}{os.path.splitext(filename)[1]}")
rename_tasks.append((old_path, new_path))
with concurrent.futures.ThreadPoolExecutor(max_workers=4) as executor:
results = list(executor.map(rename_file, rename_tasks))
print(f"成功重命名 {sum(results)}/{len(results)} 个文件")
7.2 图形界面封装
对于非技术用户,可以封装成简单的GUI应用:
python复制import os
import tkinter as tk
from tkinter import filedialog, messagebox
class RenameApp:
def __init__(self):
self.window = tk.Tk()
self.window.title("批量重命名工具")
tk.Label(self.window, text="目标文件夹:").pack()
self.folder_entry = tk.Entry(self.window, width=50)
self.folder_entry.pack()
tk.Button(self.window, text="浏览...", command=self.select_folder).pack()
tk.Label(self.window, text="新文件名模式:").pack()
self.pattern_entry = tk.Entry(self.window, width=50)
self.pattern_entry.pack()
self.pattern_entry.insert(0, "file_{n}{ext}")
tk.Button(self.window, text="执行重命名", command=self.do_rename).pack()
def select_folder(self):
folder = filedialog.askdirectory()
if folder:
self.folder_entry.delete(0, tk.END)
self.folder_entry.insert(0, folder)
def do_rename(self):
folder = self.folder_entry.get()
pattern = self.pattern_entry.get()
if not os.path.isdir(folder):
messagebox.showerror("错误", "请选择有效的文件夹路径")
return
try:
files = os.listdir(folder)
for i, filename in enumerate(files, 1):
ext = os.path.splitext(filename)[1]
new_name = pattern.format(n=i, ext=ext)
os.rename(
os.path.join(folder, filename),
os.path.join(folder, new_name)
)
messagebox.showinfo("完成", f"成功重命名 {len(files)} 个文件")
except Exception as e:
messagebox.showerror("错误", str(e))
app = RenameApp()
app.window.mainloop()
7.3 命令行工具开发
将功能封装成命令行工具,方便重复使用:
python复制import os
import argparse
from pathlib import Path
def main():
parser = argparse.ArgumentParser(description="批量重命名工具")
parser.add_argument("folder", help="目标文件夹路径")
parser.add_argument("-p", "--pattern", default="{n}{ext}",
help="文件名模式,可用变量: {n}=序号, {ext}=扩展名")
parser.add_argument("-s", "--start", type=int, default=1,
help="起始序号")
parser.add_argument("-d", "--dry-run", action="store_true",
help="试运行,不实际重命名")
args = parser.parse_args()
if not os.path.isdir(args.folder):
print(f"错误:文件夹 '{args.folder}' 不存在")
return
files = sorted(os.listdir(args.folder))
for i, filename in enumerate(files, args.start):
path = Path(filename)
new_name = args.pattern.format(n=i, ext=path.suffix)
if args.dry_run:
print(f"[试运行] '{filename}' -> '{new_name}'")
else:
try:
os.rename(
os.path.join(args.folder, filename),
os.path.join(args.folder, new_name)
)
print(f"已重命名: '{filename}' -> '{new_name}'")
except Exception as e:
print(f"重命名 '{filename}' 失败: {e}")
if __name__ == "__main__":
main()
这个脚本可以保存为rename_tool.py,然后通过命令行调用:
bash复制python rename_tool.py /path/to/folder -p "document_{n}{ext}" -s 1
8. 安全注意事项
在开发文件批量处理工具时,安全性不容忽视:
-
路径遍历攻击防护:确保脚本不会意外处理上级目录的文件
python复制def is_safe_path(base, path): """检查路径是否在基础目录内""" base = os.path.abspath(base) path = os.path.abspath(path) return os.path.commonpath([base]) == os.path.commonpath([base, path]) -
操作前确认:特别是处理重要文件时,添加确认步骤
python复制def confirm_rename(files): print(f"即将重命名 {len(files)} 个文件:") for old, new in files[:5]: # 只显示前5个示例 print(f" {old} -> {new}") if len(files) > 5: print(f" ...还有 {len(files)-5} 个文件") return input("确认执行? (y/n): ").lower() == "y" -
备份机制:重要文件操作前自动创建备份
python复制import shutil def backup_files(folder): backup_dir = os.path.join(folder, "backup") os.makedirs(backup_dir, exist_ok=True) for filename in os.listdir(folder): if filename != "backup": src = os.path.join(folder, filename) dst = os.path.join(backup_dir, filename) shutil.copy2(src, dst)
9. 性能优化建议
处理超大量文件时(如10万+),需要考虑性能优化:
-
使用生成器减少内存占用
python复制def get_large_file_list(folder): with os.scandir(folder) as it: for entry in it: if entry.is_file(): yield entry.name -
批量提交操作(某些文件系统优化)
python复制import pywintypes import win32file def fast_rename_windows(old, new): try: win32file.MoveFileEx(old, new, win32file.MOVEFILE_REPLACE_EXISTING) except pywintypes.error as e: print(f"重命名失败: {e}") -
进度显示:长时间操作时显示进度
python复制from tqdm import tqdm def rename_with_progress(folder): files = list(os.listdir(folder)) for filename in tqdm(files): # 重命名操作
10. 跨平台兼容性处理
不同操作系统对文件名的限制不同,需要特别注意:
-
文件名长度限制:
- Windows:260字符(路径+文件名)
- Linux/macOS:通常255字符(仅文件名)
-
非法字符处理:
python复制def sanitize_filename(name): """移除文件名中的非法字符""" if os.name == 'nt': # Windows illegal = '<>:"/\\|?*' else: # Unix-like illegal = '/' for char in illegal: name = name.replace(char, '_') return name -
大小写敏感处理:
python复制def case_sensitive_rename(old, new): """处理大小写敏感的文件系统重命名""" temp = old + ".tmp" os.rename(old, temp) os.rename(temp, new)
11. 测试策略
为批量重命名脚本编写测试用例:
python复制import unittest
import tempfile
import shutil
class TestRenameScript(unittest.TestCase):
@classmethod
def setUpClass(cls):
cls.test_dir = tempfile.mkdtemp()
# 创建测试文件
for i in range(5):
with open(os.path.join(cls.test_dir, f"test_{i}.txt"), "w") as f:
f.write("test")
@classmethod
def tearDownClass(cls):
shutil.rmtree(cls.test_dir)
def test_basic_rename(self):
# 执行重命名
rename_files(self.test_dir, "new_{n}.txt")
# 验证结果
files = os.listdir(self.test_dir)
self.assertEqual(len(files), 5)
for i in range(5):
self.assertIn(f"new_{i+1}.txt", files)
if __name__ == "__main__":
unittest.main()
12. 实际应用案例扩展
12.1 音乐文件整理
整理下载的音乐文件,统一命名格式:
python复制import os
from mutagen.easyid3 import EasyID3
def rename_music_files(folder):
for filename in os.listdir(folder):
if filename.lower().endswith('.mp3'):
filepath = os.path.join(folder, filename)
try:
audio = EasyID3(filepath)
artist = audio.get('artist', ['Unknown'])[0]
title = audio.get('title', ['Unknown'])[0]
new_name = f"{artist} - {title}.mp3"
new_name = "".join(c for c in new_name if c not in '\/:*?"<>|')
os.rename(filepath, os.path.join(folder, new_name))
except Exception as e:
print(f"处理 {filename} 失败: {e}")
12.2 科研数据归档
标准化科研数据文件名:
python复制import os
import re
def rename_research_data(folder, project_code, researcher):
date_pattern = re.compile(r"\d{4}-\d{2}-\d{2}")
for filename in os.listdir(folder):
# 尝试从文件名中提取日期
match = date_pattern.search(filename)
date = match.group(0) if match else "nodate"
ext = os.path.splitext(filename)[1]
new_name = f"{project_code}_{researcher}_{date}{ext}"
os.rename(
os.path.join(folder, filename),
os.path.join(folder, new_name)
)
13. 异常处理最佳实践
健壮的重命名脚本需要完善的错误处理:
python复制import os
import sys
def robust_rename(old, new):
try:
os.rename(old, new)
return True
except FileNotFoundError:
print(f"错误: 文件 {old} 不存在", file=sys.stderr)
except PermissionError:
print(f"错误: 没有权限重命名 {old}", file=sys.stderr)
except FileExistsError:
print(f"错误: 目标文件 {new} 已存在", file=sys.stderr)
except OSError as e:
print(f"系统错误: {e}", file=sys.stderr)
return False
14. 与版本控制系统集成
在Git仓库中安全地批量重命名:
python复制import os
import subprocess
def git_rename(folder, pattern):
"""在Git仓库中执行重命名,保持历史记录"""
if not os.path.isdir(os.path.join(folder, ".git")):
print("错误: 不是Git仓库")
return
files = os.listdir(folder)
for i, filename in enumerate(files, 1):
if filename == ".git":
continue
ext = os.path.splitext(filename)[1]
new_name = pattern.format(n=i, ext=ext)
subprocess.run([
"git", "-C", folder,
"mv", filename, new_name
], check=True)
15. 性能对比:Python vs 其他方法
我对比了几种常见的批量重命名方法:
| 方法 | 1000个文件耗时 | 优点 | 缺点 |
|---|---|---|---|
| Python脚本 | 1.2s | 灵活可定制 | 需要编程知识 |
| Windows批处理 | 2.8s | 系统内置 | 功能有限 |
| macOS Automator | 3.5s | 图形界面 | 不够灵活 |
| Linux rename命令 | 0.8s | 非常快 | 学习曲线陡峭 |
| 专业软件 | 4.2s | 功能全面 | 通常收费 |
Python在灵活性和性能之间取得了很好的平衡,特别是处理复杂重命名规则时优势明显。
16. 资源监控与性能分析
处理大量文件时监控资源使用情况:
python复制import os
import time
import psutil
def monitor_rename(folder):
start_time = time.time()
process = psutil.Process(os.getpid())
mem_before = process.memory_info().rss / 1024 / 1024 # MB
# 执行重命名操作
rename_files(folder)
mem_after = process.memory_info().rss / 1024 / 1024
elapsed = time.time() - start_time
print(f"内存使用: {mem_before:.2f}MB -> {mem_after:.2f}MB")
print(f"耗时: {elapsed:.2f}秒")
17. 代码优化技巧
提高Python文件操作性能的几个技巧:
-
使用os.scandir()代替os.listdir()
python复制# 更快的方式 with os.scandir(folder) as it: for entry in it: if entry.is_file(): print(entry.name) -
减少os.path.join调用
python复制# 预先计算目录路径 folder_path = os.path.abspath(folder) + os.sep new_path = folder_path + new_name -
批量操作减少系统调用
python复制# 先收集所有操作,再批量执行 operations = [] for filename in os.listdir(folder): operations.append((old, new)) for old, new in operations: os.rename(old, new)
18. 用户交互增强
添加更多用户友好的交互功能:
python复制def interactive_rename():
print("=== 批量重命名工具 ===")
folder = input("请输入文件夹路径: ").strip()
if not os.path.isdir(folder):
print("错误: 路径不存在或不是文件夹")
return
print("\n当前文件列表:")
files = os.listdir(folder)
for i, f in enumerate(files[:10], 1):
print(f" {i}. {f}")
if len(files) > 10:
print(f" ...共 {len(files)} 个文件")
pattern = input("\n请输入新文件名模式 (使用{n}表示序号, {ext}表示扩展名): ")
confirm = input(f"即将重命名 {len(files)} 个文件,确认吗? (y/n): ")
if confirm.lower() == "y":
rename_files(folder, pattern)
print("操作完成!")
19. 创建可重用的Python包
将功能封装成可安装的Python包:
-
创建项目结构:
code复制batch_renamer/ ├── __init__.py ├── core.py ├── cli.py └── gui.py -
核心功能 (core.py):
python复制import os from pathlib import Path class BatchRenamer: def __init__(self, folder): self.folder = Path(folder).resolve() def rename(self, pattern, start=1): for i, f in enumerate(self.folder.iterdir(), start): if f.is_file(): new_name = pattern.format(n=i, ext=f.suffix) f.rename(f.parent / new_name) -
打包发布:
- 创建setup.py
- 使用pip install -e . 开发模式安装
- 可以发布到PyPI
20. 与其他工具集成
20.1 与文件管理器集成
在Windows中添加到右键菜单:
-
创建批处理文件:
batch复制@echo off python "C:\path\to\renamer.py" "%1" -
修改注册表添加右键菜单项
20.2 与IDE集成
在VSCode中创建任务:
json复制{
"label": "批量重命名",
"type": "shell",
"command": "python ${workspaceFolder}/scripts/renamer.py ${fileDirname}",
"problemMatcher": []
}
20.3 与自动化工具集成
通过Makefile调用:
makefile复制rename:
python scripts/renamer.py documents/ --pattern "doc_{n}{ext}"
21. 不同场景下的命名策略
根据文件类型采用不同的命名规范:
-
照片:
- 基于EXIF日期:YYYYMMDD_HHMMSS.ext
- 基于内容:Location_Subject_Date.ext
-
文档:
- 项目编号:PRJ-1234_v2.docx
- 版本控制:Proposal_v1.2_20230501.pdf
-
代码文件:
- 功能描述:data_processor.py
- 模块划分:utils/logger.py
-
数据集:
- 包含元数据:WeatherData_2023_Temp_Humidity.csv
- 标准化命名:DS-001_raw.csv
22. 自动化测试与持续集成
为批量重命名工具设置自动化测试:
python复制# test_renamer.py
import pytest
import tempfile
import shutil
from batch_renamer import BatchRenamer
@pytest.fixture
def test_folder():
dir = tempfile.mkdtemp()
# 创建测试文件
for i in range(3):
with open(os.path.join(dir, f"test_{i}.txt"), "w") as f:
f.write("test")
yield dir
shutil.rmtree(dir)
def test_basic_rename(test_folder):
renamer = BatchRenamer(test_folder)
renamer.rename("file_{n}{ext}")
files = os.listdir(test_folder)
assert set(files) == {"file_1.txt", "file_2.txt", "file_3.txt"}
设置GitHub Actions自动化测试:
yaml复制name: Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.9'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install pytest
- name: Test with pytest
run: |
pytest -v
23. 文档与帮助系统
为脚本添加完善的帮助文档:
python复制"""
批量重命名工具
功能:
- 批量重命名指定文件夹下的所有文件
- 支持自定义命名模式
- 支持序号、日期等变量替换
使用示例:
1. 基本使用:
python renamer.py /path/to/folder --pattern "file_{n}{ext}"
2. 从指定序号开始:
python renamer.py /path/to/folder --pattern "doc_{n}" --start 100
3. 试运行(不实际重命名):
python renamer.py /path/to/folder --dry-run
参数说明:
folder 目标文件夹路径
-p, --pattern 文件名模式 (默认: "{n}{ext}")
-s, --start 起始序号 (默认: 1)
-d, --dry-run 试运行模式
-h, --help 显示帮助信息
"""
24. 国际化支持
为工具添加多语言支持:
python复制import gettext
import locale
# 设置本地化
try:
lang = locale.getdefaultlocale()[0]
except:
lang = 'en'
locales_dir = os.path.join(os.path.dirname(__file__), 'locales')
t = gettext.translation('renamer', locales_dir, [lang], fallback=True)
_ = t.gettext
print(_("Starting batch rename..."))
print(_("Processing folder: {}").format(folder))
print(_("{count} files renamed successfully").format(count=success_count))
创建翻译文件locales/zh_CN/LC_MESSAGES/renamer.po:
code复制msgid "Starting batch rename..."
msgstr "开始批量重命名..."
msgid "Processing folder: {}"
msgstr "正在处理文件夹: {}"
msgid "{count} files renamed successfully"
msgstr "成功重命名 {count} 个文件"
25. 实际项目中的经验分享
在长期使用Python进行文件批量处理的过程中,我总结了以下几点经验:
-
先备份再操作:无论脚本看起来多么可靠,处理重要文件前一定要备份。我曾经因为一个正则表达式错误导致几百个文件被错误重命名,幸好有备份。
-
小规模测试:先用少量文件测试脚本,确认效果后再处理全部文件。可以创建一个test文件夹,放入几个样本文件进行试验。
-
日志记录必不可少:详细记录每个文件的重命名过程,包括时间戳、原始名称、新名称和操作状态。这样出问题时可以追溯。
-
处理异常情况:考虑各种边界情况:文件名包含空格、特殊字符、不同大小写、超长文件名等。完善的错误处理能让脚本更健壮。
-
性能考量:对于超大量文件(10万+),需要考虑内存使用和性能优化。使用生成器而非列表,考虑多线程处理。
-
用户友好性:如果是给非技术人员使用,添加进度显示、预估剩余时间、清晰的操作指引等功能。
-
跨平台兼容:不同操作系统对文件名的限制不同(如Windows不允许某些字符),要确保脚本在各平台都能正常工作。
-
版本控制:将脚本纳入版本控制系统,方便追踪修改和回滚。特别是业务关键脚本,应该有完整的版本历史。
-
文档注释:即使是自己使用的脚本,也要添加充分的注释和文档。几个月后回头看时,你会感谢自己这样做。
-
持续改进:根据实际使用中发现的问题不断优化脚本。收集用户反馈,添加最需要的功能。
