Python:批量改文件名(Windows版)

点触鼠标,轻松实现文件序列化更名。

代码涉及文件夹及文件操作、正则表达式、多线程和tkinter等知识。

用法:

1. 点击“Click me”按钮

2. 在弹出窗口中选择一个文件夹

3. 点击“Choose”执行更名或“取消”放弃更名

4. 撤销所有序列化更名,请点击“Undo”

5. 点击“Check”按钮查看操作结果

6. 下方会动态显示处理结果

所有隐藏文件或子文件夹将被略过。

# -*-coding:utf-8-*-
"""This is a free tool which easily adds sequence numbers to names of files
in a selected folder, just by clicking your mouse few times.

Here is the usage:
1. Press the 'Click me' button.
2. Select a folder in the pop-up window.
3. Click 'Choose' to execute the operation or 'Cancel' to give it up.
4. 'Undo' button is used to remove sequence numbers.
5. Press 'Check' to make sure the operation has been completed successfully.

Note that operations on hidden files or sub-folders are neglected.
"""
import os
import sys
import re
import win32file
import win32con
import threading
import tkinter as tk
from tkinter import filedialog


class EasyReNamer(tk.Tk):
    def __init__(self):
        super().__init__()
        self.title("EasyReNamer V3.0")
        self.n = 0
        label_info = tk.Label(self, text="Please select a folder:")
        label_info.pack()
        panel = tk.Frame()
        self.btn_rename = tk.Button(panel, text="Click Me", width=10,
                               bg='orange',
                               command=threading.Thread(target=self.rename).start)
        self.btn_rename.grid(row=0, column=0, padx=30)
        self.btn_undo = tk.Button(panel, text="Undo", width=10,
                             bg="grey",
                             command=self.undo)
        self.btn_undo.grid(row=0, column=1, padx=30)
        btn_check = tk.Button(panel, text="Check", width=10,
                              bg='blue', fg = 'white', 
                              command=self.check)
        btn_check.grid(row=0, column=2, padx=30)
        panel.pack()
        self.label_show = tk.Label(self)
        self.label_show.pack()

    def widget_position(self, width, height):
        self.width = self.winfo_screenwidth()
        self.height = self.winfo_screenheight()
        x = (self.width - width) / 2
        y = (self.height - height) / 2
        self.geometry('%dx%d+%d+%d' % (width, height, x, y))
        self.grid()

    def get_items_list(self):
        try:
            self.folder_path = filedialog.askdirectory(title='EasyReNamer')
            self.items_list = os.listdir(self.folder_path)
        except OSError:
            print("Opening failed")
            sys.exit()

    def rename(self):
        self.get_items_list()
        self.btn_rename.config(state='disabled')
        for item in self.items_list.copy():
            item_path = self.folder_path + os.sep + item
            file_flag = win32file.GetFileAttributesW(item_path)
            is_hiden = file_flag & win32con.FILE_ATTRIBUTE_HIDDEN
            if os.path.isdir(item_path) or  is_hiden:
                continue
            else:
                new_item_path = self.folder_path + os.sep + '(' + \
                                str(self.n + 1) + ')' + item
                os.rename(item_path, new_item_path)
                self.n += 1
                self.label_show.config(text="{} file(s) renamed".format(self.n))
        self.label_show.config(text="{} file(s) completed successfully".format(self.n))

    def undo(self):
        self.get_items_list()
        for item in self.items_list.copy():
            item_path = self.folder_path + os.sep + item
            file_flag = win32file.GetFileAttributesW(item_path)
            is_hiden = file_flag & win32con.FILE_ATTRIBUTE_HIDDEN
            if os.path.isdir(item_path) or  is_hiden:
                continue
            else:
                new_item_path = self.folder_path + os.sep + re.sub('\(\d*\)','',item)
                os.rename(item_path, new_item_path)
        self.label_show.config(text='Undo Finished!')

    def check(self):
        filedialog.askopenfilename()



if __name__ == "__main__":
    root = EasyReNamer()
    root.widget_position(500, 70)
    root.resizable(0, 0)
    root.mainloop()

猜你喜欢

转载自blog.csdn.net/wokaoyan1981/article/details/104276829
今日推荐