之前给大家分享过iReg小程序:文件批量重命名 v0.5,可以很方便地批量给文件添加前缀、后缀、替换指定关键词、将大写英文字母转为小写,以及根据2024年3月中国电子申报新规一键重命名:
最近有iReg群友提出一个新的需求,即把指定文件夹及其子文件夹下所有文件的文件名提取到一个Excel格式的文件列表里,然后用户在这个文件列表中根据自己的需求批量输入自己需要修改的文件名,进而进行修改。小格用Python开发了一个新的小程序给大家:
使用演示如下:
使用步骤如下:
第一步、使用小程序的第一个功能“生成文件列表”,可以生成选定文件夹及其子文件夹所有文件的文件信息列表(文件名为:“文件信息列表.xlsx”)并保存在所选文件夹下,包含文件大小、创建日期、修改日期、文件名和文件路径;
第二步、打开“文件信息列表.xlsx”,在标红的D列“修改后的文件名(不带扩展名)”输入需要修改的文件名,如果无需修改则留空,修改之后保存并关闭。如果涉及一定规律性的命名,需要综合使用Excel的排序、筛选、函数、选择性粘贴等功能,可以购买书籍或者在B站检索相关教程快速学习;
第三步、使用小程序的第二个功能“开始重命名”,即可批量重命名。
小程序下载链接及二维码如下,欢迎大家下载试用(压缩包内含小程序、使用说明、视频演示和测试文件):
https://pan.baidu.com/s/11INW4cwoJ3d7eWFPxNQ6HQ?pwd=iReg
同时把源代码分享给大家,欢迎大家提出宝贵建议,以便不断完善:
import tkinter
import tkinter.filedialog
import tkinter.messagebox
import os
from datetime import datetime
from openpyxl import Workbook
from openpyxl.styles import Font
from openpyxl import load_workbook
# 定义提取文件信息的函数
def get_file_details(root_folder):
file_details = []
# 遍历指定文件夹及其子文件夹中的所有文件
for dirpath, dirnames, filenames in os.walk(root_folder):
for filename in filenames:
file_path = os.path.join(dirpath, filename) # 构造文件的完整路径
file_stats = os.stat(file_path) # 获取文件的状态信息
# 文件大小(以KB为单位)
file_size_kb = file_stats.st_size // 1024
# 创建日期(注意:这在所有平台上可能不起作用)
creation_date = datetime.fromtimestamp(file_stats.st_ctime)
# 修改日期
modification_date = datetime.fromtimestamp(file_stats.st_mtime)
# 不带扩展名的文件名
file_name_without_ext = os.path.splitext(filename)[0]
# 带扩展名的完整文件名
file_name_with_ext = filename
# 将文件信息添加到列表中
file_details.append((file_size_kb, creation_date, modification_date, file_name_without_ext, file_name_with_ext, file_path))
return file_details
# 定义将文件信息保存为Excel文件“文件信息列表”的函数
def save_to_excel(file_details, output_file):
wb = Workbook() # 创建一个新的工作簿
ws = wb.active # 获取活动工作表
ws.title = "File Details" # 设置工作表标题
# 写入列标题
headers = ['文件大小 KB', '创建日期', '修改日期', '文件名(不带扩展名)', '文件名(带扩展名)', '文件路径']
ws.append(headers)
# 写入文件详细信息
for detail in file_details:
ws.append(detail)
# 在C列之后插入一个新列
col_idx = 4
ws.insert_cols(col_idx)
# 设置新列的标题
new_header = "修改后的文件名(不带扩展名)"
ws.cell(row=1, column=col_idx, value=new_header)
# 将新列的标题字体颜色设置为红色
red_font = Font(color="FF0000")
ws.cell(row=1, column=col_idx).font = red_font
# 保存工作簿
wb.save(output_file)
# 定义根据用户修改后的Excel文件“文件信息列表”批量重命名的函数
def rename_by_excel(file_details_modified):
# 加载Excel工作簿
wb = load_workbook(file_details_modified)
ws = wb.active
# 遍历Excel中的行,从第二行开始(第一行是标题)
for row in ws.iter_rows(min_row=2, values_only=True):
# 如果新文件名为空,则跳过
if not row[3]:
continue
original_file_name = row[4]
new_file_name = row[3]
original_file_path = row[6]
new_file_path = original_file_path.replace(original_file_name, new_file_name)
# 检查文件是否存在,以及新路径是否与原路径相同
if os.path.exists(original_file_path) and original_file_path != new_file_path:
# 重命名文件
os.rename(original_file_path, new_file_path)
class Window():
def __init__(self):
self.root = root = tkinter.Tk()
self.label1 = tkinter.Label(root, text='选择目录')
self.label1.grid(row=0, column=0)
self.entryDir1 = tkinter.Entry(root)
self.entryDir1.grid(row=0, column=1)
self.BrowserDirButton1 = tkinter.Button(root, text='浏览', command=self.BrowserDir)
self.BrowserDirButton1.grid(row=0, column=2)
self.ButtonCov1 = tkinter.Button(root, text='生成文件列表', command=self.Conv1, )
self.ButtonCov1.grid(row=0, column=3)
self.label2 = tkinter.Label(root, text='选择文件')
self.label2.grid(row=1, column=0)
self.entryfile_name2 = tkinter.Entry(root)
self.entryfile_name2.grid(row=1, column=1)
self.BrowserDirButton2 = tkinter.Button(root, text='浏览', command=self.select_file)
self.BrowserDirButton2.grid(row=1, column=2)
self.ButtonCov2 = tkinter.Button(root, text='开始重命名', command=self.Conv2, )
self.ButtonCov2.grid(row=1, column=3)
def BrowserDir(self):
directory = tkinter.filedialog.askdirectory(title='iReg小程序')
if directory:
self.entryDir1.delete(0, tkinter.END)
self.entryDir1.insert(tkinter.END, directory)
def select_file(self):
# 弹出选择文件对话框
file_name = tkinter.filedialog.askopenfilename(title='iReg小程序')
if file_name:
self.entryfile_name2.delete(0, tkinter.END)
self.entryfile_name2.insert(tkinter.END, file_name)
def Conv1(self):
root_folder = self.entryDir1.get() # 指定要扫描的文件夹路径
output_file = self.entryDir1.get() + "\文件信息列表.xlsx" # 指定输出Excel文件的路径
# 获取文件详细信息并保存到Excel中
file_details = get_file_details(root_folder)
save_to_excel(file_details, output_file)
tkinter.messagebox.showinfo("iReg", "文件信息列表已生成 ")
def Conv2(self):
rename_by_excel(self.entryfile_name2.get())
tkinter.messagebox.showinfo("iReg", "重命名已完成 ")
def mainloop(self):
self.root.minsize(380, 120)
self.root.maxsize(380, 120)
self.root.title('iReg小程序')
self.root.mainloop()
if __name__ == "__main__":
window = Window()
window.mainloop()