AI神助攻!小白也能制作自动重命名工具~

我们平时从网上下载一些文件,文件名很多都是一大串字母和数字,不打开看看,根本不知道里面是什么内容。

在这里插入图片描述

我想能不能做个工具,把我们一个文件夹下面的所有word、excel、ppt、pdf文件重命名为文件内容的第一行。

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

我们有些朋友可能不会编程,别慌,不会编程也没关系,我们可以让AI帮我们写一个Python程序。

下面我就让Kimi帮我们写一个程序:

在这里插入图片描述

我把上面这段代码复制到vscode中,把‘path_to_your_directory’替换成自己的文件夹路径,直接运行一下。

在这里插入图片描述

很不幸,报错了,没事,把错误提示复制出来,继续问Kimi:

在这里插入图片描述

再报错,再问:

在这里插入图片描述

你就不厌其烦的问。

AI的一个好处是他永远不会发脾气,哈哈,你只管问就行,不管你的问题有多白痴,它总是会耐心回答,也不会笑话你,这点AI比人类要强百倍。

最终AI给出了一个可运行的版本:

import os
from docx import Document
from openpyxl import load_workbook
from pptx import Presentation
from pdfminer.high_level import extract_text

def get_first_line_from_word(file_path):
    try:
        doc = Document(file_path)
        return doc.paragraphs[0].text if doc.paragraphs else ''
    except Exception as e:
        print(f"Error reading Word file {file_path}: {e}")
        return ''

def get_first_line_from_excel(file_path):
    try:
        wb = load_workbook(file_path)
        sheet = wb.active
        for row in sheet.iter_rows(min_row=1, values_only=True):
            for value in row:
                if value is not None:
                    return str(value)
        return ''
    except Exception as e:
        print(f"Error reading Excel file {file_path}: {e}")
        return ''

def get_first_line_from_ppt(file_path):
    try:
        presentation = Presentation(file_path)
        for slide in presentation.slides:
            for shape in slide.shapes:
                if hasattr(shape, 'text') and shape.text:
                    return shape.text[:shape.text.index('\n')] if '\n' in shape.text else shape.text
        return ''
    except Exception as e:
        print(f"Error reading PPT file {file_path}: {e}")
        return ''

def get_first_line_from_pdf(file_path):
    try:
        text = extract_text(file_path)
        return text.split('\n', 1)[0] if text else ''
    except Exception as e:
        print(f"Error reading PDF file {file_path}: {e}")
        return ''

def rename_files(directory):
    for filename in os.listdir(directory):
        if filename.lower().endswith(('.docx', '.xlsx', '.pptx', '.pdf')) and not filename.lower().startswith('.~') :
            file_path = os.path.join(directory, filename)
            first_line = ''
            if filename.lower().endswith('.docx'):
                first_line = get_first_line_from_word(file_path)
            elif filename.lower().endswith('.xlsx'):
                first_line = get_first_line_from_excel(file_path)
            elif filename.lower().endswith('.pptx'):
                first_line = get_first_line_from_ppt(file_path)
            elif filename.lower().endswith('.pdf'):
                first_line = get_first_line_from_pdf(file_path)
            
            if first_line:
                new_filename = first_line.strip() + os.path.splitext(filename)[1]
                new_file_path = os.path.join(directory, new_filename)
                os.rename(file_path, new_file_path)
                print(f"Renamed {filename} to {new_filename}")
            else:
                print(f"No first line found for {filename}")

# Specify the directory containing the files
directory = '/Users/zhan/Documents/test'  # Replace with the path to your directory
rename_files(directory)

运行效果如下:

在这里插入图片描述

我们还需要一个UI界面,让我们可以在图形界面上操作,我们继续问Kimi:

在这里插入图片描述
最终代码如下:

import os
from docx import Document
from openpyxl import load_workbook
from pptx import Presentation
from pdfminer.high_level import extract_text
import tkinter as tk
from tkinter import filedialog, messagebox
from tkinter import ttk

def get_first_line_from_word(file_path):
    try:
        doc = Document(file_path)
        return doc.paragraphs[0].text if doc.paragraphs else ''
    except Exception as e:
        print(f"Error reading Word file {file_path}: {e}")
        return ''

def get_first_line_from_excel(file_path):
    try:
        wb = load_workbook(file_path)
        sheet = wb.active
        for row in sheet.iter_rows(min_row=1, values_only=True):
            for value in row:
                if value is not None:
                    return str(value)
        return ''
    except Exception as e:
        print(f"Error reading Excel file {file_path}: {e}")
        return ''

def get_first_line_from_ppt(file_path):
    try:
        presentation = Presentation(file_path)
        for slide in presentation.slides:
            for shape in slide.shapes:
                if hasattr(shape, 'text') and shape.text:
                    return shape.text[:shape.text.index('\n')] if '\n' in shape.text else shape.text
        return ''
    except Exception as e:
        print(f"Error reading PPT file {file_path}: {e}")
        return ''

def get_first_line_from_pdf(file_path):
    try:
        text = extract_text(file_path)
        return text.split('\n', 1)[0] if text else ''
    except Exception as e:
        print(f"Error reading PDF file {file_path}: {e}")
        return ''

def rename_files(directory):
    for filename in os.listdir(directory):
        if filename.lower().endswith(('.docx', '.xlsx', '.pptx', '.pdf')) and not filename.lower().startswith('.~') :
            file_path = os.path.join(directory, filename)
            first_line = ''
            if filename.lower().endswith('.docx'):
                first_line = get_first_line_from_word(file_path)
            elif filename.lower().endswith('.xlsx'):
                first_line = get_first_line_from_excel(file_path)
            elif filename.lower().endswith('.pptx'):
                first_line = get_first_line_from_ppt(file_path)
            elif filename.lower().endswith('.pdf'):
                first_line = get_first_line_from_pdf(file_path)
            
            if first_line:
                new_filename = first_line.strip() + os.path.splitext(filename)[1]
                new_file_path = os.path.join(directory, new_filename)
                os.rename(file_path, new_file_path)
                print(f"Renamed {filename} to {new_filename}")
            else:
                print(f"No first line found for {filename}")


# Specify the directory containing the files
directory = '/Users/zhan/Documents/test'  # Replace with the path to your directory      


# 这里是之前定义的rename_files函数和子函数
def choose_directory():
    directory = filedialog.askdirectory()
    if directory:
        entry.delete(0, tk.END)
        entry.insert(0, directory)

def rename_files_with_ui():
    directory = entry.get()
    if not directory:
        messagebox.showerror("错误", "请选择一个文件夹")
        return
    if not os.path.isdir(directory):
        messagebox.showerror("错误", "所选路径不是一个文件夹")
        return
    try:
        rename_files(directory)
        messagebox.showinfo("完成", "文件重命名完成")
    except Exception as e:
        messagebox.showerror("错误", f"发生错误: {e}")


# 创建主窗口
root = tk.Tk()
root.title("文件批量重命名工具")

# 创建一个标签和输入框用于显示选择的文件夹路径
label = ttk.Label(root, text="请选择文件夹:")
label.pack()
entry = tk.Entry(root, width=30)
entry.pack()

# 创建一个按钮,点击时弹出选择文件夹的对话框
browse_button = ttk.Button(root, text="浏览", command=choose_directory)
browse_button.pack()

# 创建一个按钮,点击时执行重命名操作
rename_button = ttk.Button(root, text="确定", command=rename_files_with_ui)
rename_button.pack()

# 设置窗口的尺寸
width = 350  # 宽度
height = 200  # 高度

# 获取屏幕的宽度和高度
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()

# 计算窗口的中心坐标
x = (screen_width / 2) - (width / 2)
y = (screen_height / 2) - (height / 2)

# 将窗口放置在屏幕中心
root.geometry(f'{width}x{height}+{int(x)}+{int(y)}')

# 运行主循环
root.mainloop()


我们看下运行效果:

在这里插入图片描述

试了一下,功能和上面的程序是一样的。

最后一步就是打包程序了,同样我们问下AI:

在这里插入图片描述
一共就两步:

  1. 安装PyInstaller
pip install pyinstaller
  1. 使用PyInstaller打包
pyinstaller --onefile --windowed file_renamer_gui.py

注意要把“file_renamer_gui.py"替换成你自己的文件名。

打包好之后,在项目目录的dist文件夹下就可以找到打包好的文件。

在这里插入图片描述

双击打开即可运行,效果是一样的。

在这里插入图片描述

好了,这个工具就写好了。

有了AI的助攻,我们想写什么工具直接让AI帮我们写就好了,是不是给了你很大的信心?

原来编程也不难,编程我也会啊~

上面的代码亲测可用,如果你想直接下载exe文件,关注公众号“编程我也会”,回复“重命名”即可下载。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

刷代码随想录有感(57):二叉搜索树中的众数

题干&#xff1a; 代码&#xff1a; class Solution { public:unordered_map<int,int>map;void traversal(TreeNode* root){if(root NULL)return;traversal(root->left);map[root->val];traversal(root->right);}bool static cmp(const pair<int,int>&a…

[蓝桥杯2024]-PWN:ezheap解析(堆glibc2.31,glibc2.31下的double free)

查看保护 查看ida 大致就是只能创建0x60大小的堆块&#xff0c;并且uaf只能利用一次 完整exp&#xff1a; from pwn import* #context(log_leveldebug) pprocess(./ezheap2.31)def alloc(content):p.sendlineafter(b4.exit,b1)p.send(content) def free(index):p.sendlineaft…

C++:运算符重载(=/==)

赋值运算符&#xff08;&#xff09;重载 在C中&#xff0c;赋值运算符可以被重载&#xff0c;允许用户定义类对象的赋值行为。通过重载赋值运算符&#xff0c;可以自定义对象的赋值操作&#xff0c;以便适应特定的需求和语义。当我们定义一个自定义的类时&#xff0c;比如一个…

语音识别---节拍器

⚠申明&#xff1a; 未经许可&#xff0c;禁止以任何形式转载&#xff0c;若要引用&#xff0c;请标注链接地址。 全文共计3077字&#xff0c;阅读大概需要3分钟 &#x1f308;更多学习内容&#xff0c; 欢迎&#x1f44f;关注&#x1f440;【文末】我的个人微信公众号&#xf…

商城数据库88张表结构完整示意图41~50(十二)

四十一&#xff1a; 四十二&#xff1a; 四十三&#xff1a; 四十四&#xff1a; 四十五&#xff1a; 四十六&#xff1a; 四十七&#xff1a; 四十八&#xff1a; 四十九&#xff1a; 五十&#xff1a;

说说你对盒子模型的理解?

一、是什么 当对一个文档进行布局&#xff08;layout&#xff09;的时候&#xff0c;浏览器的渲染引擎会根据标准之一的 CSS 基础框盒模型&#xff08;CSS basic box model&#xff09;&#xff0c;将所有元素表示为一个个矩形的盒子&#xff08;box&#xff09; 一个盒子由四…

开源推荐榜【MalusAdmin基于 Vue3/TypeScript/NaiveUI 和 NET7 Sqlsugar 开发的后台管理框架】

简介 Malus是海棠的意思&#xff0c;顾名思义&#xff0c;海棠后台管理系统&#xff0c;读音与【马卢斯】相近&#xff0c;也可称作为马卢斯后台管理系统。 基于NET Core | NET7/8 & Sqlsugar | Vue3 | vite4 | TypeScript | NaiveUI 开发的前后端分离式权限管理系统,采用…

2024SCVN南方时尚之夜:童模冰雪之境惊艳亮相

在广州黄埔君澜酒店&#xff0c;璀璨的灯光下&#xff0c;一场主题为“雪山”、“童模”与“时尚”的盛宴于2024年5月1日至5月3日华丽上演。这场名为“2024SCVN南方时尚之夜&绽放冰雪之境”的活动&#xff0c;如同一颗璀璨的明珠&#xff0c;镶嵌在初夏的广州&#xff0c;熠…

IPD-开发流程

2024-5-6记录于PR办公室 在上一家公司做硬件产品经理的时候&#xff0c;Richard Li曾花费“巨资”请了华为前战略专家给我们培训&#xff0c;讲授IPD这门课的模式都很IPD&#xff0c;当时完全没重视&#xff0c;光想着不可能靠这个能把产品做好&#xff0c;这样做产品必定是一批…

【电影】【指环王】【中土世界】影碟播放记录

一、写在前面 笔者于5月5日&#xff08;昨天&#xff09;在新加坡淘到了一套《指环王 The Lord of the Rings》DVD光碟&#xff0c;今天却听闻噩耗&#xff0c;Rohan国王Theoden的扮演者&#xff0c;英国演员Bernard Hill去世&#xff08;享年79岁&#xff09;&#xff0c;发文…

接口自动化测试之-requests模块详解

一、requests背景 Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池&#xff0c;支持使用cookie保持会话&#xff0c;支持文件上传&#xff0c;支持自动确定响应内容的编码&#xff0c;支持国际化的 URL 和 POST 数据自动编码。 二、requests安装 利用p…

Windows环境下VSCode C无法跳转自动补全

前言&#xff1a; 本文记录了自己在配置 Windows环境下 VSCode C开发环境的遇到的问题和解决方法。 参考: vscode c语言没有代码提示_clangd提示不生效-CSDN博客 VSCODE无法跳转_vscode 不能跳转-CSDN博客 vscode c/c环境配置&#xff08;MinGW&#xff09;调用第三官方库…

鸿蒙内核源码分析(事件控制篇) | 任务间多对多的同步方案

官方概述 先看官方对事件的描述. 事件&#xff08;Event&#xff09;是一种任务间通信的机制&#xff0c;可用于任务间的同步。 多任务环境下&#xff0c;任务之间往往需要同步操作&#xff0c;一个等待即是一个同步。事件可以提供一对多、多对多的同步操作。 一对多同步模型…

冯喜运:5.6周一国际黄金实时盘面走势分,原油最新操作

【黄金消息面分析】&#xff1a;周一(5月6日)亚市盘中&#xff0c;黄金市场出现大行情。现货黄金短线加速飙升&#xff0c;金价一度触及2315美元/盎司&#xff0c;较日内低点大幅反弹逾20美元/盎司&#xff0c;目前交投于2310.61美元/盎司附近。COMEX最活跃黄金期货合约北京时间…

集合定义和使用方法

一.集合的长度 集合的长度,可以添加和删除,长度也会跟着去发生改变,数组一旦创建完成他的长度就不会发生改变。 二.集合的定义方式 ArrayList<String> list new ArrayList(); 三.集合能存储的数据类型 集合能够存储引用数据类型,存储基本数据类型需要使用包装类: 四…

年轻人刮疯了,刮刮乐断货了

年轻人刮疯了 刮刮乐缺货了。 00后彩票店老板陆诗等得有点着急。她的福彩店开在深圳&#xff0c;今年4月才开门营业&#xff0c;但从开业到今天&#xff0c;刮刮乐总共就来了一回货——开业时发的20本。 那之后&#xff0c;刮刮乐就彻底断供了。原本&#xff0c;陆诗想把刮刮…

文件加密软件排行榜前四名(2024年4大好用的加密软件推荐)

说到文件加密&#xff0c;想必大家都很熟悉&#xff0c;文件加密已经普遍应用&#xff0c;文件加密是一种重要的安全措施&#xff0c;可以确保数据的机密性、完整性和可用性&#xff0c;降低因数据泄露或丢失带来的风险 。 下面小编给大家分享几款常用的加密软件&#xff0c;…

深入C语言:文件操作实现局外影响程序

一、什么是文件 文件其实是指一组相关数据的有序集合。这个数据集有一个名称&#xff0c;叫做文件名。文件通常是驻留在外部介质(如磁盘等)上的&#xff0c;在使用时才调入内存中来。 文件一般讲两种&#xff1a;程序文件和数据文件&#xff1a; 程序文件&#xff1a;包括源程…

Android Studio实现简单的自定义钟表

项目目录 一、项目概述二、开发环境三、详细设计3.1、尺寸设置3.2、绘制表盘和指针3.3、动态效果 四、运行演示五、总结展望六、源码获取 一、项目概述 在安卓开发中&#xff0c;当系统自带的View已经无法满足项目需求时&#xff0c;就要自定义View。在Android中是没有与钟表有…

Linux PXE高效批量网络装机

系统初始化 systemctl disable --now firewalld.service setenforce 0 vim /etc/selinux/config 安装软件 yum install -y tftp-server xinetd dhcp vsftpd syslinux 复制 vmlinuz initrd.img pxelinux.0 到 /var/lib/tftpboot/ 目录 [rootlocalhost ~]# cd /mnt/…