Python自动批量修改文件名称的方法
本文介绍基于Python语言,按照一定命名规则批量修改多个文件的文件名的方法。
已知现有一个文件夹,其中包括班级所有同学上交的作业文件,每人一份;所有作业文件命名格式统一,都是地信1701_姓名_学习心得格式。

现需要对每一位同学的作业文件加以改名,有很多种需求。
第一种需求,将每一位同学作业文件名中原本是姓名的部分,都修改为学号。即原本的地信1701_姓名_学习心得修改为地信1701_学号_学习心得(每一位同学有且仅有一个学号,且相互不重复,且姓名与学号的对应关系我们是已知的),如下图所示。

第二种需求,将每一位同学作业文件名中原本姓名的部分的后面,都添加上学号。即原本的地信1701_姓名_学习心得修改为地信1701_姓名_学号_学习心得,如下图所示。

第三种需求,将每一位同学满足第二种需求后的作业文件名中的下划线_部分,都修改为连接符-。即原本的地信1701_姓名_学号_学习心得修改为地信1701-姓名-学号-学习心得,如下图所示。

好了,知道了需求我们就可以开始进行代码的编写了。
首先,导入必要的库。
import os
from openpyxl import load_workbook
接下来,我们首先需要让程序知道每一位同学的姓名与学号之间的对应关系。因为我们已知姓名与学号之间的关系,因此首先需要类似于下图的表格,其中为姓名与学号的一一对应关系。

接下来,我们需要将上述表格中的内容在Python中以字典的格式存储。具体代码如下,关于这一部分代码的解释大家查看Python导入Excel表格数据并以字典dict格式保存即可,此处就不再赘述。
original_path='F:/学习/2020-2021-2/形势与政策(二)/论文与学习心得/01_学习心得/地信1701-学习心得/'
look_up_table_path='F:/学习/2020-2021-2/形势与政策(二)/论文与学习心得/01_学习心得/Name_Number.xlsx'
look_up_table_row_start=2
look_up_table_row_number=32
name_number_dict={}
look_up_table_excel=load_workbook(look_up_table_path)
look_up_table_all_sheet=look_up_table_excel.get_sheet_names()
look_up_table_sheet=look_up_table_excel.get_sheet_by_name(look_up_table_all_sheet[0])
for i in range(look_up_table_row_start,look_up_table_row_start+look_up_table_row_number):
number=look_up_table_sheet.cell(i,1).value
name=look_up_table_sheet.cell(i,2).value
name_number_dict[number]=name
接下来,进行第一种需求的代码实现。
# Replacement Renaming
all_word=os.listdir(original_path)
for i in range(len(all_word)):
old_name=all_word[i]
old_name_name_end=old_name.rfind('_')
old_name_name=old_name[7:old_name_name_end]
new_name_number=[k for k, v in name_number_dict.items() if v==old_name_name]
new_name=old_name.replace(old_name_name,''.join(str(w) for w in new_name_number))
os.rename(original_path+old_name,original_path+new_name)
其中,由于大家的姓名有两个字、三个字或者更多字,因此我们使用了old_name_name_end获取原有文件名称中姓名最后一个字所在的下标;而姓名开始的位置是确定的,即从而确定了每一位同学姓名在原有文件名中的起始与终止下标位置。同时利用replace,依据同学的姓名,在字典中搜索该同学的学号,最后将同学的名字替换为其对应的学号。
其次,是第二种需求。
# Additional Renaming
all_word=os.listdir(original_path)
for i in range(len(all_word)):
old_name=all_word[i]
old_name_name_end=old_name.rfind('_')
old_name_name=old_name[7:old_name_name_end]
new_name_number=[k for k, v in name_number_dict.items() if v==old_name_name]
old_name_list=list(old_name)
insert_number=''.join(str(w) for w in new_name_number)+'_'
old_name_list.insert(old_name_name_end+1,insert_number)
new_name=''.join(old_name_list)
os.rename(original_path+old_name,original_path+new_name)
在这里,同样使用old_name_name_end获取原有文件名称中姓名最后一个字所在的下标,从而确定了每一位同学姓名在原有文件名中的起始与终止下标位置。此外,利用insert,将学号这一项插入到原有的文件名称中。
最后,是第三种需求。
# Modified Renaming
all_word=os.listdir(original_path)
for i in range(len(all_word)):
old_name=all_word[i]
new_name=old_name.replace('_',"-",3)
os.rename(original_path+old_name,original_path+new_name)
这个就简单很多了,直接利用replace,用连接符-替换掉原有的下划线_即可。
至此,大功告成。
Python自动批量修改文件名称的方法的更多相关文章
- node批量修改文件名称
let fs = require('fs');//引用文件系统模块 let PATH = `./app_zijietiaodong/`;//当前文件夹 let ext = { readFileList ...
- 【Python】简单的脚本,轻松批量修改文件名称
使用python脚本,批量修改文件夹名称 先创建一些没用的案例文件 import os #创建新文件夹 dir = os.makedirs('D:\\SomeThing\\testfile') #将文 ...
- Java实现批量修改文件名称
import java.io.File; import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; /** ...
- php实现批量修改文件名称
场景叙述:比如我要将D:\WWW\img\Gastroenterology这个文件夹下图片要重新命名成1.jpg,2.jpg.......这样的有规律名字, 如下图: 那么我们就可以利用php的ren ...
- php批量修改文件名称
<?php//利用PHP目录和文件函数遍历用户给出目录的所有的文件和文件夹,修改文件名称function fRename($dirname){ if(!is_dir($dirname)){ ec ...
- python批量修改文件名称
参考文章:http://www.cnblogs.com/ma6174/archive/2012/05/04/2482378.html 最近遇到一个问题,在网上下载了一批视频课程,需要将每节课的名称标号 ...
- excel批量修改文件名称
步骤: 1. 然后将标准号所在的列复制三份到旁边相邻的空白列 2. 使用方方格子让三列中最左面的列只保存如下格式的数据: DB37/T或DB37/ 3. 使用方方格子让三列中中间的列的只保存如下格式的 ...
- Python自动批量修改服务器密码
工作中,我们经常会定期更换服务器密码,如果手动去修改,不仅费时,而且容易出错.下面提供了一种思路,可以实现批量.自动修改服务器密码. 大致思路:首先,为每一台服务器设定一个唯一标识:其次,将每台服务器 ...
- windows powershell上批量修改文件名称
$i = Get-ChildItem -Path c:\pictures -Filter *.jpg | ForEach-Object { $extension = $_.Extension $new ...
- IO流-批量修改文件名称案例
/* * 源文件名: 桌面-我们今天学习IO流了哈哈哈哈-001.jpg * 修改后文件名: 桌面-000x.jpg */public class File_listFiles_upda ...
随机推荐
- 文盘Rust -- 把程序作为守护进程启动
当我们写完一个服务端程序,需要上线部署的时候,或多或少都会和操作系统的守护进程打交道,毕竟谁也不希望shell关闭既停服.今天我们就来聊聊这个事儿. 最早大家部署应用的通常操作是 "nohu ...
- Burpsuite(科学版)安装教程
前言 BurpSuite是一款用于攻击web 应用程序的集成平台,在安全圈被称作"抓包神器".本文主要讲解 BurpSuite破解版的安装教程. 配置环境变量 BurpSuite是 ...
- python 队列(QUEUE)
QUEUE python中多线程编程的数据结构 基本FIFO队列 class Queue.Queue(maxsize=0) 先进先出,maxsize为队列中能存放的数据个数上限. import Que ...
- Uniapp And Taro一些小测评
前情 最近公司准备新开发一个小程序项目,对于使用哪一款小程序框架有一些犹豫,我有过2年左右的uniapp项目开发经验,Taro在刚刚出来的时候有尝试过,经常莫名报错需要重启,在内心是有些偏向uniap ...
- IO多路复用的理解/演变过程
目录 阻塞IO 非阻塞 IO select epoll 总结一下. 阻塞IO 服务端为了处理客户端的连接和请求的数据,写了如下代码. listenfd = socket(); // 打开一个网络通信端 ...
- EasyPoi 导出Excel(ExcelExportEntity生成表头)
[引入依赖] <!--easypoi--> <dependency> <groupId>cn.afterturn</groupId> <artif ...
- Day20:继承详解
继承的理解 继承:对类进行抽象化:也就是将存在的类构造成新的类: 比如说学生是一个类,老师是一个类,那么我们可以将学生类和老师类收纳进人这个类:那么学生和老师则为子类(派生类).人为父类(基类):子类 ...
- ajax 跨域请求jsonp
最近一段时间为这个事情走了不少弯路,现将成功经验分享,避免后来人再绕远路,不过也是第一次使用中间有什么问题大家可以留言探讨. ajax的跨域请求jsonp主要运用于不同系统的交互,一个系统想通过该种方 ...
- ArcObjects SDK开发 002 写第一个ArcObjects SDK程序
1.开发环境 基于ArcObjects SDK开发,开发环境一般选用Visual Studio,开发语言使用C#,开发包使用ArcObjects SDK for .Net.UI有的使用Winform, ...
- <一>对象使用过程中背后调用了哪些方法
代码1 #include <iostream> using namepspace std; class Test { public: Test(int a=10):ma(a){cout&l ...