sin2019 发表于 2024-10-21 11:46

用copilot写的文件重命名器

用copilot写的文件重命名器,源码直接放出来先读取修改文件的文件夹    然后读取excle文件excle文件是旧名字和新名字的对照关系
import os
import tkinter as tk
from tkinter import filedialog, messagebox
import pandas as pd
def rename_files(file_mapping, log_file):
    """
    根据文件映射关系重命名文件,并记录日志。
    :param file_mapping: 文件名映射字典,键为旧文件名,值为新文件名。
    :param log_file: 日志文件路径。
    """
    try:
      with open(log_file, 'a') as log:
            for old_name, new_name in file_mapping.items():
                for file in os.listdir():
                  file_base, file_ext = os.path.splitext(file)
                  old_base, old_ext = os.path.splitext(old_name)
                  if file_base == old_base:
                        new_file = new_name if '.' in new_name else new_name + file_ext
                        os.rename(file, new_file)
                        log.write(f"Renamed {file} to {new_file}\n")
                        print(f"Renamed {file} to {new_file}")
            messagebox.showinfo("成功", "文件已成功重命名。")
    except Exception as e:
      messagebox.showerror("错误", f"错误: {e}")
      print(f"Error: {e}")
def delete_substring_from_files(directory, substring, log_file):
    """
    从文件名中删除指定的子字符串,并记录日志。
    :param directory: 文件所在目录。
    :param substring: 要删除的子字符串。
    :param log_file: 日志文件路径。
    """
    try:
      with open(log_file, 'a') as log:
            for root, _, files in os.walk(directory):
                for file in files:
                  if substring in file:
                        new_name = file.replace(substring, "")
                        old_name = os.path.join(root, file)
                        new_name = os.path.join(root, new_name)
                        os.rename(old_name, new_name)
                        log.write(f"Renamed {old_name} to {new_name}\n")
                        print(f"Renamed {old_name} to {new_name}")
            messagebox.showinfo("成功", "子字符串已成功从文件中删除。")
    except Exception as e:
      messagebox.showerror("错误", f"错误: {e}")
      print(f"Error: {e}")
def change_file_extension(directory, old_ext, new_ext, log_file):
    """
    批量修改文件后缀,并记录日志。
    :param directory: 文件所在目录。
    :param old_ext: 旧的文件后缀。
    :param new_ext: 新的文件后缀。
    :param log_file: 日志文件路径。
    """
    try:
      with open(log_file, 'a') as log:
            for root, _, files in os.walk(directory):
                for file in files:
                  if file.endswith(old_ext):
                        base = os.path.splitext(file)[0]
                        new_name = base + new_ext
                        old_name = os.path.join(root, file)
                        new_name = os.path.join(root, new_name)
                        os.rename(old_name, new_name)
                        log.write(f"Changed extension of {old_name} to {new_name}\n")
                        print(f"Changed extension of {old_name} to {new_name}")
            messagebox.showinfo("成功", "文件后缀已成功修改。")
    except Exception as e:
      messagebox.showerror("错误", f"错误: {e}")
      print(f"Error: {e}")
def select_directory():
    """
    选择要操作的目录。
    """
    directory = filedialog.askdirectory()
    if directory:
      directory_entry.delete(0, tk.END)
      directory_entry.insert(0, directory)
def load_excel():
    """
    加载包含文件名映射关系的 Excel 文件。
    """
    file_path = filedialog.askopenfilename(filetypes=[("Excel files", "*.xlsx;*.xls")])
    if file_path:
      try:
            df = pd.read_excel(file_path)
            for index, row in df.iterrows():
                old_name = str(row[0])
                new_name = str(row[1])
                file_mapping[old_name] = new_name
                mapping_listbox.insert(tk.END, f"{old_name} -> {new_name}")
            messagebox.showinfo("成功", "Excel 文件已成功加载。")
      except Exception as e:
            messagebox.showerror("错误", f"加载 Excel 文件时出错: {e}")
def clear_mappings():
    """
    清空文件名映射关系。
    """
    file_mapping.clear()
    mapping_listbox.delete(0, tk.END)
    messagebox.showinfo("成功", "文件名映射关系已清空。")
def start_renaming():
    """
    开始重命名文件。
    """
    directory = directory_entry.get()
    if directory:
      os.chdir(directory)
      rename_files(file_mapping, 'rename_log.txt')
    else:
      messagebox.showerror("错误", "请选择一个目录")
def start_deleting():
    """
    开始删除文件名中的指定子字符串。
    """
    directory = directory_entry.get()
    substring = substring_entry.get()
    if directory and substring:
      delete_substring_from_files(directory, substring, 'rename_log.txt')
    else:
      messagebox.showerror("错误", "请选择一个目录并输入要删除的子字符串")
def start_changing_extension():
    """
    开始批量修改文件后缀。
    """
    directory = directory_entry.get()
    old_ext = old_ext_entry.get()
    new_ext = new_ext_entry.get()
    if directory and old_ext and new_ext:
      change_file_extension(directory, old_ext, new_ext, 'rename_log.txt')
    else:
      messagebox.showerror("错误", "请选择一个目录并输入旧后缀和新后缀")
# 初始化文件名映射字典
file_mapping = {}
# 创建主窗口
root = tk.Tk()
root.title("文件重命名器")
# 选择目录
tk.Label(root, text="选择重命名文件目录:").grid(row=0, column=0, padx=10, pady=10)
directory_entry = tk.Entry(root, width=50)
directory_entry.grid(row=0, column=1, padx=10, pady=10)
tk.Button(root, text="浏览", command=select_directory).grid(row=0, column=2, padx=10, pady=10)
# 加载 Excel 文件
tk.Button(root, text="加载重命名对照 Excel 文件", command=load_excel).grid(row=1, columnspan=3, pady=10)
# 显示映射关系
mapping_listbox = tk.Listbox(root, width=50)
mapping_listbox.grid(row=2, columnspan=3, padx=10, pady=10)
# 清空映射关系按钮
tk.Button(root, text="清空对照关系", command=clear_mappings).grid(row=3, columnspan=3, pady=10)
# 删除子字符串
tk.Label(root, text="输入要删除的子字符串:").grid(row=4, column=0, padx=10, pady=10)
substring_entry = tk.Entry(root)
substring_entry.grid(row=4, column=1, padx=10, pady=10)
tk.Button(root, text="删除子字符串", command=start_deleting).grid(row=4, column=2, padx=10, pady=10)
# 修改文件后缀
tk.Label(root, text="输入旧后缀:(后缀前面加点例如.png)").grid(row=5, column=0, padx=10, pady=10)
old_ext_entry = tk.Entry(root)
old_ext_entry.grid(row=5, column=1, padx=10, pady=10)
tk.Label(root, text="输入新后缀:(后缀前面加点例如.png)").grid(row=6, column=0, padx=10, pady=10)
new_ext_entry = tk.Entry(root)
new_ext_entry.grid(row=6, column=1, padx=10, pady=10)
tk.Button(root, text="修改文件后缀", command=start_changing_extension).grid(row=6, column=2, padx=10, pady=10)
# 重命名按钮
tk.Button(root, text="重命名文件", command=start_renaming).grid(row=7, columnspan=3, pady=20)
# 运行应用程序
root.mainloop()

sin2019 发表于 2024-10-21 11:48

本帖最后由 sin2019 于 2024-10-21 15:00 编辑

根据excle的对照关系 进行重命名然后再追加了 删除名字里面某些特定的字符串还有修改文件后缀功能   下载链接123盘有pyinstaller封装的exe文件还有py源文件   https://www.123pan.com/s/sR5xjv-GPZLH

知心 发表于 2024-10-21 12:37

用代码标记包一下,方便阅读
import os
import tkinter as tk
from tkinter import filedialog, messagebox
import pandas as pd


def rename_files(file_mapping, log_file):
    """
    根据文件映射关系重命名文件,并记录日志。
    :param file_mapping: 文件名映射字典,键为旧文件名,值为新文件名。
    :param log_file: 日志文件路径。
    """
    try:
      with open(log_file, 'a') as log:
            for old_name, new_name in file_mapping.items():
                for file in os.listdir():
                  file_base, file_ext = os.path.splitext(file)
                  old_base, old_ext = os.path.splitext(old_name)
                  if file_base == old_base:
                        new_file = new_name if '.' in new_name else new_name + file_ext
                        os.rename(file, new_file)
                        log.write(f"Renamed {file} to {new_file}\n")
                        print(f"Renamed {file} to {new_file}")
            messagebox.showinfo("成功", "文件已成功重命名。")
    except Exception as e:
      messagebox.showerror("错误", f"错误: {e}")
      print(f"Error: {e}")


def delete_substring_from_files(directory, substring, log_file):
    """
    从文件名中删除指定的子字符串,并记录日志。
    :param directory: 文件所在目录。
    :param substring: 要删除的子字符串。
    :param log_file: 日志文件路径。
    """
    try:
      with open(log_file, 'a') as log:
            for root, _, files in os.walk(directory):
                for file in files:
                  if substring in file:
                        new_name = file.replace(substring, "")
                        old_name = os.path.join(root, file)
                        new_name = os.path.join(root, new_name)
                        os.rename(old_name, new_name)
                        log.write(f"Renamed {old_name} to {new_name}\n")
                        print(f"Renamed {old_name} to {new_name}")
            messagebox.showinfo("成功", "子字符串已成功从文件中删除。")
    except Exception as e:
      messagebox.showerror("错误", f"错误: {e}")
      print(f"Error: {e}")


def change_file_extension(directory, old_ext, new_ext, log_file):
    """
    批量修改文件后缀,并记录日志。
    :param directory: 文件所在目录。
    :param old_ext: 旧的文件后缀。
    :param new_ext: 新的文件后缀。
    :param log_file: 日志文件路径。
    """
    try:
      with open(log_file, 'a') as log:
            for root, _, files in os.walk(directory):
                for file in files:
                  if file.endswith(old_ext):
                        base = os.path.splitext(file)
                        new_name = base + new_ext
                        old_name = os.path.join(root, file)
                        new_name = os.path.join(root, new_name)
                        os.rename(old_name, new_name)
                        log.write(
                            f"Changed extension of {old_name} to {new_name}\n")
                        print(f"Changed extension of {old_name} to {new_name}")
            messagebox.showinfo("成功", "文件后缀已成功修改。")
    except Exception as e:
      messagebox.showerror("错误", f"错误: {e}")
      print(f"Error: {e}")


def select_directory():
    """
    选择要操作的目录。
    """
    directory = filedialog.askdirectory()
    if directory:
      directory_entry.delete(0, tk.END)
      directory_entry.insert(0, directory)


def load_excel():
    """
    加载包含文件名映射关系的 Excel 文件。
    """
    file_path = filedialog.askopenfilename(
      filetypes=[("Excel files", "*.xlsx;*.xls")])
    if file_path:
      try:
            df = pd.read_excel(file_path)
            for index, row in df.iterrows():
                old_name = str(row)
                new_name = str(row)
                file_mapping = new_name
                mapping_listbox.insert(tk.END, f"{old_name} -> {new_name}")
            messagebox.showinfo("成功", "Excel 文件已成功加载。")
      except Exception as e:
            messagebox.showerror("错误", f"加载 Excel 文件时出错: {e}")


def clear_mappings():
    """
    清空文件名映射关系。
    """
    file_mapping.clear()
    mapping_listbox.delete(0, tk.END)
    messagebox.showinfo("成功", "文件名映射关系已清空。")


def start_renaming():
    """
    开始重命名文件。
    """
    directory = directory_entry.get()
    if directory:
      os.chdir(directory)
      rename_files(file_mapping, 'rename_log.txt')
    else:
      messagebox.showerror("错误", "请选择一个目录")


def start_deleting():
    """
    开始删除文件名中的指定子字符串。
    """
    directory = directory_entry.get()
    substring = substring_entry.get()
    if directory and substring:
      delete_substring_from_files(directory, substring, 'rename_log.txt')
    else:
      messagebox.showerror("错误", "请选择一个目录并输入要删除的子字符串")


def start_changing_extension():
    """
    开始批量修改文件后缀。
    """
    directory = directory_entry.get()
    old_ext = old_ext_entry.get()
    new_ext = new_ext_entry.get()
    if directory and old_ext and new_ext:
      change_file_extension(directory, old_ext, new_ext, 'rename_log.txt')
    else:
      messagebox.showerror("错误", "请选择一个目录并输入旧后缀和新后缀")


# 初始化文件名映射字典
file_mapping = {}
# 创建主窗口
root = tk.Tk()
root.title("文件重命名器")
# 选择目录
tk.Label(root, text="选择重命名文件目录:").grid(row=0, column=0, padx=10, pady=10)
directory_entry = tk.Entry(root, width=50)
directory_entry.grid(row=0, column=1, padx=10, pady=10)
tk.Button(root, text="浏览", command=select_directory).grid(
    row=0, column=2, padx=10, pady=10)
# 加载 Excel 文件
tk.Button(root, text="加载重命名对照 Excel 文件", command=load_excel).grid(
    row=1, columnspan=3, pady=10)
# 显示映射关系
mapping_listbox = tk.Listbox(root, width=50)
mapping_listbox.grid(row=2, columnspan=3, padx=10, pady=10)
# 清空映射关系按钮
tk.Button(root, text="清空对照关系", command=clear_mappings).grid(
    row=3, columnspan=3, pady=10)
# 删除子字符串
tk.Label(root, text="输入要删除的子字符串:").grid(row=4, column=0, padx=10, pady=10)
substring_entry = tk.Entry(root)
substring_entry.grid(row=4, column=1, padx=10, pady=10)
tk.Button(root, text="删除子字符串", command=start_deleting).grid(
    row=4, column=2, padx=10, pady=10)
# 修改文件后缀
tk.Label(root, text="输入旧后缀:(后缀前面加点例如.png)").grid(
    row=5, column=0, padx=10, pady=10)
old_ext_entry = tk.Entry(root)
old_ext_entry.grid(row=5, column=1, padx=10, pady=10)
tk.Label(root, text="输入新后缀:(后缀前面加点例如.png)").grid(
    row=6, column=0, padx=10, pady=10)
new_ext_entry = tk.Entry(root)
new_ext_entry.grid(row=6, column=1, padx=10, pady=10)
tk.Button(root, text="修改文件后缀", command=start_changing_extension).grid(
    row=6, column=2, padx=10, pady=10)
# 重命名按钮
tk.Button(root, text="重命名文件", command=start_renaming).grid(
    row=7, columnspan=3, pady=20)
# 运行应用程序
root.mainloop()

13729181580 发表于 2024-10-21 14:32

感谢分享

sin2019 发表于 2024-10-21 14:43

知心 发表于 2024-10-21 12:37
用代码标记包一下,方便阅读
import os
import tkinter as tk


感谢 第一次发帖 直接发了 没有在意格式

cao777 发表于 2024-10-21 17:08

本帖最后由 cao777 于 2024-10-21 17:14 编辑

用vscode调试后 直接出现了界面 很棒
想请教下 怎么能把这个源码 打包生成可以执行的应用程序 谢谢
用什么能打包成应用程序界面呢
谢谢!

sin2019 发表于 2024-10-21 17:25

cao777 发表于 2024-10-21 17:08
用vscode调试后 直接出现了界面 很棒
想请教下 怎么能把这个源码 打包生成可以执行的应用程序 谢谢
用什 ...

1楼的 里面我放了 123盘的下载链接 里面有pyinstaller命令封装的exe文件 打包执行文件 pyinstaller命令可以打包。就是包有点大100多m

d199212 发表于 2024-10-22 08:13

全部都是copilot写的?

cao777 发表于 2024-10-22 10:39

本帖最后由 cao777 于 2024-10-22 10:47 编辑

sin2019 发表于 2024-10-21 17:25
1楼的 里面我放了 123盘的下载链接 里面有pyinstaller命令封装的exe文件 打包执行文件 pyinstaller命令可 ...
先pip install pyinstaller 安装这个包
然后pyinstaller 1.py生成程序


进入1.py同目录的dist文件夹下 有个1.ex和一个文件夹
打开1.exe 正常运行了 但是有个命令框
如何让他变成单文件可正常运行的呢

谢谢
如何用pyinstaller命令打包呢
在cmd界面 直接pyinstaller x.py这样?

sin2019 发表于 2024-10-23 00:36

d199212 发表于 2024-10-22 08:13
全部都是copilot写的?

如果硬说的话,百分之99是。功能从简单到复杂的过程中,copliot对后缀的参照关系经常变动,所以临时手改了一下。
页: [1] 2
查看完整版本: 用copilot写的文件重命名器