批量改文件名小程序里的几个“坑”

(1)程序功能:运行后主窗口打开。点击Click Me按钮,应该弹出一个文件夹选择窗口,选择好文件夹点击确认后,将文件夹中的文件(不包括隐藏文件和子文件夹)的名称前面加上序号。在按钮下面显示已处理的文件数量。

图1 主窗口和子窗口效果

图2 批量重命名(文件名前添加了序号)的效果,注意第一个隐藏文件已经略过了。

(2)初始方案:

import os
from tkinter import filedialog
import tkinter as tk
from tkinter import Button
class ReName():
    def __init__(self):
        self.n = 0

    def rename(self):

        file_path = filedialog.askdirectory(title='ReNamer')
        file_lists = os.listdir(file_path)
        for file in file_lists.copy():
            oldname = file_path + os.sep + file
            if os.path.isdir(oldname):
                continue
            else:
                newname = file_path + os.sep + '(' + str(self.n + 1) + ')' + file
                os.rename(oldname, newname)
                self.n+=1
        print(self.n)

ins=ReName()
root=tk.Tk()
root.geometry("550x200")
label=tk.Label(root,font=("Arial Bold",15),
               text='Please select a directory to rename files in the folder:')
label.pack()
btn=Button(root,font=("Arial",15),bg='orange',text="Click Me",command=ins.rename())
btn.pack()
print(ins.n)
label=tk.Label(root,text=str(ins.n)+' file(s) renamed.')
label.pack()
root.mainloop()

(3)主要问题:主窗口没有显示Click Me按钮;主窗口和子窗口同时弹出;未筛除隐藏文件(macos下)

(4)修改后的方案:

import os
from tkinter import filedialog
import tkinter as tk
from tkinter import Button
import stat

root=tk.Tk()
class ReName():
    def __init__(self):
        self.n = 0   #3
        self.label1=tk.Label(root)
    def rename(self):

        file_path = filedialog.askdirectory(title='ReNamer')
        self.file_lists = os.listdir(file_path)
        for self.file in self.file_lists.copy():
            self.oldname = file_path + os.sep + self.file
            if os.path.isdir(self.oldname) or self.file.startswith('.'):   #4
                continue
            else:
                self.newname = file_path + os.sep + '(' + str(self.n + 1) + ')' + self.file
                os.rename(self.oldname, self.newname)   #5
                self.n+=1
            self.label1.config(text='{} file(s) renamed'.format(self.n))   #6
            self.label1.pack()

ins=ReName()


root.geometry("550x200")
label=tk.Label(root,font=("Arial Bold",15),
               text='Please select a directory to rename files in the folder:')
label.pack()
btn=Button(root,font=("Arial",15),bg='orange',text="Click Me",command=ins.rename)   #1 #2
btn.pack()
root.mainloop()

(5)心得:

#1 :

command=后面跟的是函数名,绝不可在末尾添加括号。这意味着并没有调用类ReName的rename方法,因此n永远等于初始值0;

#2:

button里面的command是点击触发动作的入口;

#3:

若要在方法外使用类的属性n,应该申明在def __init(self):里面,而不是在方法里,记得前面要加self.;

#4:

macos下判断隐藏文件的方法为startswith('.');

#5:

系统方法os.rename()的两个参数均需要全路径,只给出文件名文件名是不行的;

#6:

label.config(text='{} file(s) renamed'.format(self.n))的含义,还有别忘了配对的label.pack()

(6)后续功能:

考虑只允许点击Button一次,随后变为灰色disabled状态。

若以上内容有不足之处,请不吝指出。最后还要感谢图灵QQ群、csdn、思否和stackoverflow上面的好心牛人,我的每一寸进步都离不开你们热心的帮助!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于自己经常利用浏览器插件下载网页图片,由此产生很多的文件夹和文件,这些文件夹的名字多半是网页的title,导致文件夹名很长,文件名多是些很长的数。感觉这样的状况不是很好就自己用java实现了简单的shell来管理这些自动下载的批量文件产生的文件夹和文件! 使用注意事项: 该程序默认的工作路径是c:\盘,建议在windows环境下利用这则小程序,linux下未测试。 这个简单的java shell拥有以下几个命令: cd 进入要工作的目录 ls 列出该工作目录下的文件和文件夹 re 对工作目录下的文件夹名或文件名进行名操作 man 对具体的命令的详细帮助文档 pwd 显示当前工作的目录 history 显示已经输入的历史命令 help 调取帮助文档命令 exit 退出当前的程序 其中re修文件以及文件夹名的命令是这个程序的价值体现。 re/cd/ls/man这四个命令拥有命令选项,在使用命令选项的规则统一是:xx-uuff其中xx代表命令,-代表分隔符是必须的,uu代表命令选项,ff代表具体需求的字符。 pwd/history/help/exit是单个输入的命令,没有命令选项。 利用这样的命令:man-cd就可以查看cd命令使用的具体介绍,其中-是必须的,其它带有命令选项的都可以通过这种方式查看命令帮助文档。 例如输入:man-re就会列出以下信息 对当前工作目录下的文件夹名和文件名进行动的命令: re -j@#将目录下所有的文件夹名字中@#间(包括@#)内容去掉 re -q@将目录下所有文件夹名中@后(包括@)的内容去掉 re -h@将目录下所有文件夹名中@前(包括@)的内容去掉 re -k@将目录下所有文件名中的@去掉,当@为.时表示去掉名字中的空格(特注) re -m@#$将目录下所有文件名中的@#$去掉,这是去掉名字中多个字符的命令 re -r@#将目录下所有文件名中的@用#替换掉 re -s@#$%将目录下所有文件名中的@用#替换,$用%替换,这是替换名字中多个字符的命令 re -f+前面七个命令的命令选项的话就是对该工作目录下的所有文件的文件名起相应作用(小心使用)! re -fh.ppp.xxx将目录下所有符合条件的文件的文件名的后缀ppp成xxx!(较复杂,还未实现) re -fa将当前工作目录下的所有文件名按数字递增方式命!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值