手把手教你用 Python 批量统一重命名 数据文件
背景介绍
在GIS项目中,数据文件往往散落在多层文件夹里,文件名杂乱无章——有时带年份,有时不带,扩展名还五花八门。查找、备份或批量处理时,非常头疼。这个脚本就像一个“文件命名管家”,自动遍历所有子文件夹,根据所在位置的“指标名”和“子文件夹名”,加上文件名里的年份,统一重命名为“指标名_子文件夹名_年份+扩展名”的标准格式,让你的数据瞬间整齐规范。
它特别适合新手整理大型环境监测或区域评估项目的数据,只需简单配置,就能一键重命名数百个文件,避免手动改名出错或遗漏。
代码功能说明
这个脚本的核心用途是批量重命名文件夹中的GIS数据文件,解决文件名不统一、难以管理的痛点。它会自动扫描根目录下所有层级的文件,提取所在文件夹的指标名和子文件夹名,从文件名中找出4位年份,然后重命名为标准格式。同时支持特殊扩展名(如.tif.vat.dbf),并智能跳过已符合规则或无年份的文件。
适用场景包括:多时相遥感数据整理、环境指标文件标准化、项目成果归档。运行后,你会在终端看到实时提示如“✅ 重命名:old.tif -> 地面沉降_2020_2021.tif”“⏭ 已符合命名规则,跳过:xxx.tif”,最终所有文件直接在原位置重命名完成,文件夹结构不变,但文件名统一规范,便于后续排序或批量处理。
运行环境准备
环境准备确保脚本顺利执行,就像检查工具箱是否齐全,避免中途缺零件。为什么要做这一步?脚本用Python标准库,兼容性强,但版本太老可能不支持某些函数。
- Python版本要求:Python 3.8+(推荐3.10+)。为什么?os.walk和re模块在老版本行为一致,但新版更稳定。
- 检查:在终端输入 python --version。
- 操作系统:Windows、Mac或Linux均可(路径格式会自动适配)。
- 数据准备:根目录下有至少两层子文件夹(指标名 > 子文件夹),文件名为含年份的TIF或SHP等。
这些就位后,脚本可在任何Python环境中运行。
详细运行步骤
步骤按顺序设计,像整理抽屉一样先分类再贴标签。每步解释“为什么”,让你理解逻辑:不是机械复制,而是知道“这一步是为了不乱套”。
- 环境准备:
为什么?确认Python可用,避免导入失败。
- 打开终端(Windows用CMD/PowerShell,Mac/Linux用Terminal)。
- 测试:输入 python -c "import os, re, shutil; print('环境OK')",显示“环境OK”即通过。
- 依赖安装:
为什么?脚本只用os、re、shutil标准库,无需额外安装,直接跳过或确认即可。
- 无需pip命令,所有模块内置Python。
- 如报“ModuleNotFoundError”(极少见),升级Python。
- 代码修改:
为什么?路径需指向你的实际根目录,否则脚本“找不到文件可改”。
- 新建文件 batch_rename_gis.py,复制下方代码块。
- 用记事本或VS Code打开,修改参数:
- 注意:运行前需修改 top_folder = r"【your_top_folder】" 为你的根目录,例如 r"C:\GISData\南太行项目"。
- 保存为UTF-8编码。
- # -*- coding: utf-8 -*-
- import os
- import re
- import shutil
- # ✅ 顶层目录
- top_folder = r"【your_top_folder】"
- # ✅ 匹配年份(4位数字)
- year_pattern = re.compile(r"(\d{4})")
- # ✅ 特殊扩展名(优先匹配)
- special_exts = [
- ".tif.vat.dbf", ".tif.vat.cpg", ".tif.xml", # 栅格附属
- ".shp", ".shx", ".dbf", ".prj", ".cpg" # 矢量附属
- ]
- def get_special_ext(filename):
- """返回文件的特殊扩展名,如果没有则返回普通扩展名"""
- for ext in special_exts:
- if filename.lower().endswith(ext):
- return ext
- return os.path.splitext(filename)[1]
- # ✅ 遍历所有文件
- for root, dirs, files in os.walk(top_folder):
- parts = os.path.normpath(root).split(os.sep)
- # 至少要有两级:...\\指标名\\子文件夹(不限更深)
- if len(parts) < 3:
- continue
- indicator_name = parts[-2] # 倒数第二层作为指标名
- subfolder_name = parts[-1] # 最后一层作为子目录名
-
- for filename in files:
- if filename.lower().endswith(".py"): # 跳过脚本
- continue
-
- old_path = os.path.join(root, filename)
-
- # 已符合命名规则,跳过
- if f"{indicator_name}_{subfolder_name}_" in filename:
- print(f"⏭ 已符合命名规则,跳过:{filename}")
- continue
-
- # 查找年份
- match = year_pattern.search(filename)
- if not match:
- print(f"⚠ 无年份匹配,跳过:{filename}")
- continue
- year = match.group(1)
-
- # 处理扩展名(支持多重)
- ext = get_special_ext(filename)
-
- # 生成新文件名
- new_filename = f"{indicator_name}_{subfolder_name}_{year}{ext}"
- new_path = os.path.join(root, new_filename)
-
- # 目标存在就跳过
- if os.path.exists(new_path):
- print(f"⏭ 目标文件已存在,跳过:{new_filename}")
- continue
-
- try:
- os.rename(old_path, new_path)
- print(f"✅ 重命名:{filename} -> {new_filename}")
- except Exception as e:
- print(f"❌ 重命名失败:{filename} -> {new_filename},原因:{e}")
复制代码 - 执行命令:
为什么?启动遍历和重命名,实现自动化统一。
- 在终端中,切换到脚本目录:输入 cd 【your_script_path】(例如 cd C:\Scripts)。
- 运行:python batch_rename_gis.py。
- 观察终端输出,时间取决于文件数量(通常几秒到几分钟)。
- 验证结果:
为什么?确认重命名正确,像检查标签贴对没。
- 打开原文件夹,查看文件名是否变为“指标_子文件夹_年份.扩展名”。
- 随机挑几个文件,在资源管理器按名称排序,应按指标和年份整齐排列。
- 如果有“跳过”提示,说明已处理或无需改。
核心代码解析
脚本像一个“文件贴标签工”:先逛遍所有抽屉(os.walk),看抽屉标签(文件夹名),给里面的东西(文件)贴上统一标签(新文件名)。用大白话解释关键逻辑——就像教朋友整理衣柜,只说“按颜色分类是为了找得快”。
- 遍历文件夹(for root, dirs, files in os.walk(top_folder)):
这行像“全屋搜查”:从根目录开始,一层一层走进每个子文件夹,列出文件清单。为什么?确保不漏任何深层文件。
- 提取名字(indicator_name = parts[-2]; subfolder_name = parts[-1]):
想象成“读抽屉标签”:路径拆成零件,取倒数第二和第一作为指标和子文件夹名(需至少两层)。为什么?用位置信息自动分类,无需手动指定。
- 找年份(match = year_pattern.search(filename)):
如“扫描条码”:用正则re在文件名中抠出4位数字年份。为什么?年份是时间标签,统一带上便于按时间排序。
- 处理扩展名(get_special_ext函数):
这像“认特殊包装”:优先匹配长扩展名(如.tif.vat.dbf),否则用普通。为什么?GIS文件常有复合扩展,错认会截断名字。
- 重命名(os.rename(old_path, new_path)):
核心如“贴新标签”:生成新名后直接改名,try-except防出错中断。为什么?直接在原位改,结构不变;异常处理像“安全网”,单个坏不影响整体。
整体聪明跳过(已符合、无年份、目标存在),避免重复工作。新手懂了,就能改成复制而非重命名。
常见问题解决
新手重命名时易遇小障碍,这些避坑点如“注意事项”,帮你快速过关。为什么补充?因为权限和路径问题最常见,提前知晓省调试时间。
- 环境版本要求:
- Python 3.8+。
- 常见报错:“SyntaxError”。解决:升级Python或检查缩进。
- 路径错误:
- 报“No such file or directory”或无输出。
- 解决:用 r"路径"(raw字符串),从资源管理器复制完整路径,确保目录至少两层深。为什么?路径如门牌,错就进不了门。
- 重命名失败:
- 报“Permission denied”或“File exists”。
- 解决:关闭占用文件的软件(如ArcGIS),以管理员运行终端;目标存在时脚本已自动跳过。为什么?文件被锁或同名冲突常见于GIS数据。
- 年份未匹配:
- 多文件显示“⚠ 无年份匹配”。
- 解决:确认文件名含4位数字;如需其他格式,改year_pattern正则(如r"\d{4}年")。为什么?正则严格,只认纯数字年份。
- 扩展名截错:
- 新名丢失部分扩展。
- 解决:检查special_exts列表,如缺可添加;函数已优先长扩展。为什么?复合扩展如.vat.dbf需特殊处理。
- 其他:脚本改了文件,建议先备份目录;中文路径乱码?全用英文路径。出错时,复制终端错误Google“Python os.rename [错误]”。
跑通后,你的GIS数据将井井有条。试完欢迎扩展成带备份功能,分享你的改进!
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |