当前位置: 首页 > news >正文

用 Python 批量统一重命名 文件

用 Python 批量统一重命名 文件

手把手教你用 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环境中运行。

详细运行步骤

步骤按顺序设计,像整理抽屉一样先分类再贴标签。每步解释“为什么”,让你理解逻辑:不是机械复制,而是知道“这一步是为了不乱套”。

  1. 环境准备
    为什么?确认Python可用,避免导入失败。

    • 打开终端(Windows用CMD/PowerShell,Mac/Linux用Terminal)。
    • 测试:输入 python -c "import os, re, shutil; print('环境OK')",显示“环境OK”即通过。
  2. 依赖安装
    为什么?脚本只用os、re、shutil标准库,无需额外安装,直接跳过或确认即可。

    • 无需pip命令,所有模块内置Python。
    • 如报“ModuleNotFoundError”(极少见),升级Python。
  3. 代码修改
    为什么?路径需指向你的实际根目录,否则脚本“找不到文件可改”。

    • 新建文件 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 extreturn 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:continueindicator_name = parts[-2]   # 倒数第二层作为指标名subfolder_name = parts[-1]   # 最后一层作为子目录名for filename in files:if filename.lower().endswith(".py"):  # 跳过脚本continueold_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}")continueyear = 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}")continuetry:os.rename(old_path, new_path)print(f"✅ 重命名:{filename} -> {new_filename}")except Exception as e:print(f"❌ 重命名失败:{filename} -> {new_filename},原因:{e}")
    
  4. 执行命令
    为什么?启动遍历和重命名,实现自动化统一。

    • 在终端中,切换到脚本目录:输入 cd 【your_script_path】(例如 cd C:\Scripts)。
    • 运行:python batch_rename_gis.py
    • 观察终端输出,时间取决于文件数量(通常几秒到几分钟)。
  5. 验证结果
    为什么?确认重命名正确,像检查标签贴对没。

    • 打开原文件夹,查看文件名是否变为“指标_子文件夹_年份.扩展名”。
    • 随机挑几个文件,在资源管理器按名称排序,应按指标和年份整齐排列。
    • 如果有“跳过”提示,说明已处理或无需改。

核心代码解析

脚本像一个“文件贴标签工”:先逛遍所有抽屉(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数据将井井有条。试完欢迎扩展成带备份功能,分享你的改进!

http://www.jsqmd.com/news/384957/

相关文章:

  • LeetCode 3379.转换数组:下标取模
  • Booster T1 自定义开发全流程与工具链实战指南(从环境到Sim2Real)
  • nodejs: 能在线编辑 Markdown 文档的 Web 服务程序
  • 教你用 Python 批量整理 GIS 可视化 SHP 文件
  • 用 Python 和 ArcPy 批量统计 GIS 指标到 Excel
  • Appium 服务器深度解析
  • 基于SSM的中药销售系统[SSM]-计算机毕业设计源码+LW文档
  • 2026油烟浓度检测仪选购避坑指南与国产实力厂家盘点 - 品牌推荐大师1
  • 使用 ArcPy 批量统一栅格数据的坐标系与范围
  • 别让你的小爱继续“装傻”了!5分钟给它换个“超强AI脑”,好用到全家惊呆!
  • ARM版飞牛NAS系统终于进入了公测
  • 使用 ArcPy 批量统一栅格数据的投影与裁剪
  • 完整教程:【UE5.3 C++】ARPG游戏 06-拾取武器
  • 入门分享篇:一、工欲善其事,必先利其器
  • 使用 ArcPy 统计感兴趣区面积占比并导出 Excel
  • 吃豆人skills - yi
  • 7 学习
  • Linux 中parallel命令
  • 使用 ArcPy 批量处理栅格数据:重采样与矢量裁剪
  • 张兆辉专访:《夜色正浓》沈默的复杂,是成年人的生存真相
  • 大模型API:企业AI应用落地的关键路径
  • 食品X光机选购指南:主流品牌与核心技术全解析
  • ConstraintLayout写法和Box写法比较
  • 2026主流食品X光机深度测评:技术参数与选型指南
  • 大模型API实测:关键指标与选型全解析
  • 并查集进阶
  • mysql的概述
  • 【Harmonyos】开源鸿蒙跨平台训练营DAY2:多终端工程创建运行、代码提交至AtomGit平台自建公开仓库全流程(附带出现问题及解决手段)
  • 【OI】传奇鬼王——SPFA
  • 2026恶臭在线监测设备选购大盘点:实力厂家排行及采购建议 - 品牌推荐大师1