Python根据Excel表进行文件重命名

一、问题背景

在日常办公过程中,批量重命名是经常使用的操作。之前我们已经进行了初步探索,主要是通过批处理文件、renamer软件或者Python中的pathlib等模块对当前目录下的文件进行批量重命名。

而今天我们要使用的是Python+Excel的方法对指定目录下的文件进行个性化的重命名。采用这种方法有以下两种优势:

1. 个性化重命名

原文件名和目标文件名没有规律,无法通过正则表达式进行重命名,可以用Excel对文件名进行手动编辑,对指定文件进行个性化的重命名。

2. 支持逆向重命名

以往批量重命名前,需要对原文件名进行备份,否则重命名后还需要手动改回来,十分麻烦。而这种方法只需要交换A列和B列的数据,就可以进行逆向重命名,不必担心改完后不能恢复原文件名。

二、批量重命名实现过程

1.问题的提出

当前目录下有AAA.txt,BBB.txt, CCC.txt等多个文件,我们需要把它们批量重命名为111.txt, 222.txt, 333.txt这样的形式,一般的批量重命名的方法很难实现。

问题的提出

2. 问题分析

我们把需要重命名的文件选中,在【主页】标签下点击【复制路径】获取这些文件名的路径。

获取文件路径

然后我们就可以得到下面这种样式:

"G:\桌面\用Python给文件进行批量重命名\AAA.txt"
"G:\桌面\用Python给文件进行批量重命名\BBB.txt"
"G:\桌面\用Python给文件进行批量重命名\CCC.txt"

把上面的内容复制到Excel中,按"\"和引号进行【分列】操作,最后得到【111.txt, 222.txt, 333.txt】这样的文件名,然后放到A列中,如下图所示:

批量重命名Excel文件

Excel表中,A列为旧的文件名, B列为新的文件名,我们可以手动对新文件名进行修改,然后通过Python读取txg每一行,把A列文件名重命名为B列对应的文件名。

3. 问题的解决

下一步,我们就可以采用Python编写对应代码:读取Excel文件中的A列和B列内容,然后遍历当前目录下的指定文件,采用os.rename()对文件进行重命名。

第一种方法:使用xlwings——过程有点儿复杂

原理就是读取file_name.xlsx文件中的内容,然后遍历每一行后,用os.rename()进行重命名。

import os
import xlwings as xw
name_path = r'file_name.xlsx'
# 打开工作簿
app = xw.App(visible=False, add_book=False)
app.display_alerts = False  # 关闭一些提示信息,可以加快运行速度。 默认为 True
app.screen_updating = False  # 更新显示工作表的内容。默认为 True。关闭它也可以提升运行速度
wb = app.books.open(name_path)
# 获取数据源表格
sht = wb.sheets['name']
col_data_old = sht.range('A2:A200').value  # 旧文件名,A列
col_data_new = sht.range('B2:B200').value  # 新文件名,B列
# 重命名
for i in range(len(col_data_new)):if col_data_old[i] is not None and col_data_new[i] is not None:# 如果单元格值不是 None,则处理这些值file_name = os.path.abspath(col_data_old[i])file_rename = os.path.abspath(col_data_new[i])os.rename(file_rename, file_name)
# 保存表格并退出
wb.save()
wb.close()
app.quit()

第二种方法:采用openpyxl——简化代码

相比xlwings,openpyxl的代码更为简单,逻辑也很清晰。导入模块,打开工作簿,获取表格的内容,循环每一行,读取非空数据,然后用os.rename()进行重命名。

import os
import openpyxl
name_path = r'file_name.xlsx'
# 打开工作簿
wb = openpyxl.load_workbook(name_path)
# 获取数据源表格
sht = wb.worksheets[0]
# 获取 A 列和 B 列的最大行数
max_row = max(sht.max_row, sht.max_column)
# 遍历 A 列和 B 列,将非空数据添加到字典中
for row in range(2, max_row + 1):key = sht.cell(row=row, column=1).valuevalue = sht.cell(row=row, column=2).valueif key is not None and value is not None:file_name = os.path.abspath(key)file_rename = os.path.abspath(value)os.rename(file_name, file_rename)

第三种方法:Pandas法——进一步简化

pandas这个模块导入虽然有点儿慢,但是它的重命名代码量最少,搭配上pathlib,命名效率更高。实现过程是导入pandas和path模块,读取Excel文件,把A列和B列转化为一一对应的字典,然后遍历Excel表的每一行进行批量重命名。

from pathlib import Path
import pandas as pd# 文件路径
name_path = Path('file_name.xlsx')# 读取 Excel 文件
df = pd.read_excel(name_path)# 将 A 列和 B 列数据转换为字典
data_dict = df.set_index(df.columns[0]).squeeze().to_dict()# 遍历字典,执行文件重命名
for key, value in data_dict.items():if pd.notna(key) and pd.notna(value):file_name = Path(key).absolute() # 获取原文件的绝对路径file_rename = Path(value).absolute()file_name.rename(file_rename)

以上代码中,首先将 Excel 文件读取到 df 这个数据框变量中,然后使用 set_index() 方法将第一列设置为索引,并使用 squeeze() 方法将结果转换为 Series。然后,使用 to_dict() 方法将 Series 转换为字典。最后,遍历字典,执行文件重命名操作。

三、学后反思

  1. Python在批量重命名的过程中体现出良好的跨平台性,可以把Excel表和文件连接起来,使数据的流转更加便捷。另一方面,Python在批量操作文件方面的优势明显,程序调试成功后,哪怕是上千个文件也可以轻松重命名,可以极大地提升重命名准确性和效率。
  2. 虽然我们可以通过交换A列和B列的数据进行逆向重命名,但是保险起见,还是在重命名之前对文件进行备份,然后再操作,以免出现操作失误的问题。
  3. Python程序默认是从Excel表第二行开始读取,所以一定要保留列索引,不要删除,否则可能会出现报错。
  4. 本次小项目涉及xlwings, openpyxl和pandas等Excel读取模块,以及os和pathlib等多个文件管理模块,对于读取它们之间的差异具有很好的帮助作用。可以明显看出,openpyxl和pandas比xlwings使用起来更简单,所以推荐初学者直接学openpyxl,高级的学习者可以学习pandas,为后期学习数据分析打下基础。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/653803.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL:三大日志(binlog、redolog、undolog)

再了解三个日志前我们先了解一下MySQL的两层架构: Server 层负责建立连接、分析和执行 SQL。MySQL 大多数的核心功能模块都在这实现,主要包括连接器,查询缓存、解析器、预处理器、优化器、执行器等。另外,所有的内置函数和所有跨…

Unity读书系列《Unity3D游戏开发》——拓展编辑器(一)

文章目录 前言一、扩展Project视图1、右键扩展菜单(Asset)2、监听事件3、拓展布局 二、扩展Hierarchy视图1、拓展菜单(GameObject)2、拓展布局3、重写菜单 三、扩展Inspector视图1、扩展原生组件2、扩展继承组件 四、扩展Scene视图…

【每日一题】5.LeetCode——环形链表

📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 🙏小杨水平有限,欢迎各位大佬指点&…

【智能家居入门之环境信息监测】(STM32、ONENET云平台、微信小程序、HTTP协议)

作为入门本篇只实现微信小程序接收下位机上传的数据,之后会持续发布如下项目:①可以实现微信小程序控制下位机动作,真正意义上的智能家居;②将网络通讯协议换成MQTT协议再实现上述功能,此时的服务器也不再是ONENET&…

【动态规划】【字符串】【行程码】1531. 压缩字符串

作者推荐 视频算法专题 本文涉及知识点 动态规划汇总 LeetCode 1531. 压缩字符串 II 行程长度编码 是一种常用的字符串压缩方法,它将连续的相同字符(重复 2 次或更多次)替换为字符和表示字符计数的数字(行程长度)…

MyBatis详解(6)-- 分页及缓存

MyBatis详解(6) 分页缓存特点:限制:术语:加载分类立即加载:延迟加载:mybatis缓存: 缓存的适用性MyBatis 缓存分类一级缓存注意:一级缓存未命中二级缓存二级缓存的优劣自定…

qq通讯录怎么关闭?QQ好友删除了怎么恢复?

在QQ中,通讯录是我们管理好友和进行聊天的重要工具,但有时候我们可能需要一些隐私保护,不让一些用户通过手机通讯录添加自己。如果您正在思考qq通讯录怎么关闭以及恢复意外删除的好友,本文将为您详细介绍如何关闭QQ通讯录和恢复被…

php实现多进程的几种方式

目录 一:使用pcntl扩展库 二:使用Swoole扩展 三:使用多进程模式PHP-FPM 在PHP中实现多进程主要有以下几种方式: 一:使用pcntl扩展库 pcntl扩展库提供了多线程相关的函数,如pcntl_fork()用于创建子进程…

详解操作系统各章大题汇总(死锁资源分配+银行家+进程的PV操作+实时调度+逻辑地址->物理地址+页面置换算法+磁盘调度算法)

文章目录 第三章:死锁资源分配图例一例二 第三章:银行家算法第四章:进程的同步与互斥做题步骤PV操作的代码小心容易和读者写者混 1.交通问题(类似读者写者)分析代码 2.缓冲区问题(第二个缓冲区是复制缓冲区…

RK3568驱动指南|驱动基础进阶篇-进阶6 内核运行ko文件实验——系统调用

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Idea编写mapper.xml文件提示表名和字段

一、连接database 二、setting- > language -> sql Dialects中 的选项设为 mysql就可以了 三、测试

从零开始做题:逆向 ret2shellcode orw

1.题目信息 BUUCTF在线评测 下载orw时防病毒要关闭 2.题目分析 orw是open、read、write的简写。有时候binary会通过prctl、seccomp进行沙箱保护,并不能getshell。只能通过orw的方式拿到flag。 fdopen(‘./flag’); # 打开flag文件,得到fd…

Android MTE技术详解

1.MTE概念 MTE(内存标记扩展)是ARM v8.5-A新增的一项缓解内存安全的机制。在Android Linux现有的安全机制中,类似的机制有ASAN、HWSAN。但两者因为性能开销代价高昂,不适用于广泛部署(仅调试使用)。MTE当前…

语义分割 | 基于 VGG16 预训练网络和 Segnet 架构实现迁移学习

Hi,大家好,我是源于花海。本文主要使用数据标注工具 Labelme 对猫(cat)和狗(dog)这两种训练样本进行标注,使用预训练模型 VGG16 作为卷积基,并在其之上添加了全连接层。基于标注样本…

【算法专题】动态规划综合篇

动态规划7.0 1. 最长公共子序列2. 不相交的线3. 不同的子序列4. 通配符匹配5. 正则表达式匹配6. 交错字符串7. 两个字符串的最小ASCII删除和8. 最长重复子数组 1. 最长公共子序列 题目链接 -> Leetcode -1143.最长公共子序列 Leetcode -1143.最长公共子序列 题目&#xf…

单张图像三维重建RealFusion 360◦ Reconstruction of Any Object from a Single Image

Luke Melas-Kyriazi, Iro Laina, Christian Rupprecht, Andrea Vedaldi.RealFusion 360◦ Reconstruction of Any Object from a Single Image。RealFusion: 360 Reconstruction of Any Object from a Single Image Abstract We consider th…

升降机SEW MOVIDRIVE变频器设置

SEW变频器Startup 安装好MOVITOOL软件 打开项目开始配置通信连接 以太网连接为例 在此栏输入需要连接的SEW变频器的IP地址,例如:172.25.20.120 设置完成单击“OK” 当设置完成后,请一路OK回到软件管理画面 通信配置正确的软件界面状态 单击红色刷新图标 一切准备就绪后…

DjangoURL调度器(一)

一、介绍 当一个用户请求 Django 站点的一个页面,下面是 Django 系统决定执行哪个 Python 代码使用的算法: Django确定要使用的根URLconf模块,一般是在settings中的ROOT_URLCONF设置的值,但是如果传入 HttpRequest 对象具有一个ur…

Pytest 识别case规则

一、Python测试框架,主要特点有以下几点: 简单灵活,容易上手;支持参数化;能够支持简单的单元测试和复杂的功能测试,还可以用来做selenium/appnium等自动化测试、接口自动化测试(pytestrequests…

C#简单使用Yolov5的Onnx格式模型进行目标检测

背景 最近要离职了,同事需要了解一下C#如何使用yolov5系列onnx格式模型进行目标检测,由于其对C#不熟练,可能会影响公司后续的开发进度,所以趁着还在,赶紧把手尾搞好。 方案 1、创建一个C# DotNet 8 控制台项目[可千…