find函数查找元素时,当列表中没有要找的元素时返回-1。
如下,在new_name函数中,当flag==‘1’即往后删时,如果PDF的名字中没有该特殊符号,PDF的名字后缀就会变成.pd.pdf,一开始不知道问题在哪,后面查查找找才知道当列表中没有要找的元素时返回-1,所以名字才会变成.pd.pdf,而flag==‘0’即往前删的情况由于在后面加了1,所以-1+1=0,index=0就会返回[0:]即整个列表(属于是瞎猫碰到死耗子了)
还有一个问题就是中文的破折号,往后删没有问题,但是往前删时还会留下一半破折号,类似于这样:abc——123.pdf往前删之后变成了—123.pdf,这个破折号可能是占了两个位置,于是就在filename.find(symbol)后面加2,结果又忘了区分名字中没有破折号的情况,后面加了个条件语句进行区分
import os
import sys
import tkinter as tk
from tkinter import messagebox
def new_name(filename, flag:str, symbol:str):
l = len(filename)
if flag == '0':
if symbol == '——' and symbol in filename:
index1 = filename.find(symbol) + 2
filename = filename[index1:]
else:
index2 = filename.find(symbol) + 1
filename = filename[index2:]
return filename
else:
if symbol in filename:
index = filename.find(symbol)
result = ''
parts = filename.rsplit('.', 1)
if len(parts) == 2:
result = '.' + parts[1]
filename = filename[:index] + result
return filename
else:
return filename
def rename_files(path, file_type, flag, symbol):
files = os.listdir(path)
for file in files:
if file.endswith(file_type):
old_path = os.path.join(path, file)
new_filename = new_name(file, flag, symbol)
new_path = os.path.join(path, new_filename)
try:
os.rename(old_path, new_path)
except Exception as e:
messagebox.showerror('错误', f'重命名文件失败:请检查改名后是否会重名')
return False
return True
def main():
if hasattr(sys, 'frozen'):
path = os.path.dirname(sys.executable)
elif __file__:
path = os.path.dirname(os.path.abspath(__file__))
file_type = '.pdf' # 可修改为需要处理的文件类型
flag = flag_var.get()
symbol = symbol_var.get()
if not flag or not symbol:
messagebox.showwarning('警告', '请选择有效的删减标志和符号')
return
if not rename_files(path, file_type, flag, symbol):
messagebox.showerror('错误', '批量改名失败')
else:
messagebox.showinfo('成功', '批量改名完成')
root = tk.Tk()
root.title('第三方PDF报告单文件名批量修改程序')
label1 = tk.Label(root, text='请选择:')
label1.grid(row=0, column=0)
label2 = tk.Label(root, text='请选择符号:')
label2.grid(row=1, column=0)
flag_var = tk.StringVar()
flag_var.set(0)
symbol_var = tk.StringVar()
symbol_var.set('_')
flag_radio1 = tk.Radiobutton(root, text='往前删', variable=flag_var, value='0')
flag_radio2 = tk.Radiobutton(root, text='往后删', variable=flag_var, value='1')
flag_radio1.grid(row=0, column=1, padx=10, pady=5)
flag_radio2.grid(row=0, column=2, padx=10, pady=5)
symbol_radio1 = tk.Radiobutton(root, text='_英文下划线', variable=symbol_var, value='_')
symbol_radio2 = tk.Radiobutton(root, text='-英文横杠', variable=symbol_var, value='-')
symbol_radio3 = tk.Radiobutton(root, text='——中文破折号', variable=symbol_var, value='——')
symbol_radio4 = tk.Radiobutton(root, text='空格', variable=symbol_var, value=' ')
symbol_radio1.grid(row=1, column=1, padx=10, pady=5)
symbol_radio2.grid(row=1, column=2, padx=10, pady=5)
symbol_radio3.grid(row=1, column=3, padx=10, pady=5)
symbol_radio4.grid(row=1, column=4, padx=10, pady=5)
button = tk.Button(root, text='运行', command=main).grid(row=3, column=2, sticky=tk.W, padx=30, pady=5)
root.mainloop()
对了,之前还有一个问题就是转换成exe文件后读取不到当前目录下的路径,但是在脚本中运行的时候一切正常,一开始以为是打包软件的问题,但是我在网上找的程序可以正常运行,而且这个改名程序也可以正常弹出选项框,所以我猜它应该是正常运行的,所以我在想是不是它读取不到路径,然后去网上搜了一下,跟着找到的方法进行更改就能成功运行exe文件了
如下,将我原本写的这个换成了下面那个
path = os.path.split(os.path.realpath(__file__))[0]
if hasattr(sys, 'frozen'):
application_path = os.path.dirname(sys.executable)
elif __file__:
application_path = os.path.dirname(os.path.abspath(__file__))
- os.path.dirname(path)表示去掉文件名,返回绝对路径
- sys.executable结果为字符串,表示当前运行的可执行程序所在的绝对路径。
- __file__表示当前文件的path
- os.path.abspath(_file_) 返回脚本的绝对路径
hasattr(sys, ‘frozen’):判断程序是Python脚本生成的exe文件,还是本地的Python脚本
当程序是Python脚本生成的exe文件,它会在sys模块中添加’frozen’属性。因此可以通过sys中是否含有’frozen’,来判断程序是不是exe文件
当程序是本地的Python脚本,__file__属性就能满足要求
如果是本地的Python脚本,返回的是python解析器python.exe的绝对路径
————————————————
这个路径问题的答案是从博主WarmOrange0那看到的,原文链接如下
原文链接:https://blog.csdn.net/m0_45176278/article/details/126959968