一、项目说明:
最近碰到一些需要批量处理文件的问题,手动操作都比较费时费力,比如:
(1)、查找已知文件:在一个文件夹或多个文件夹中,查找一批已知文件名的文件;
(2)、批量重命名:电脑里动不动几百上千张的照片,需要按照时间地点编号进行重命名,方便后期查看;
(3)、两个文件夹比对:一个文件夹复制了后,进行了编辑修改,然后又要查看两个文件夹内有哪些文件名不同,有哪些文件名相同但修改时间不一样的,这样就需要进行两个文件夹内文件的比对;
(4)、批量提取文件名:批量提取文件名,将文件名(包含不包含扩展名都可)、文件路径、文件创建时间、文件修改时间等信息,一并提取到一个Excel电子表格文件或者Word文件,或者文本文件中;
(5)、大小排序:有时候我们需要查看哪些文件夹比较大,占硬盘空间,但是,在Windows电脑中文件夹后面的大小不显示,这就尴尬了。于是,需要在一个文件夹内对其子文件和子文件夹一起按照大小进行排序。
于是,为解决以上问题,用pyside6和python手撸了一个批量文件处理助手工具,下载链接。
通过使用python、pyside6学习开发“想转就转批量文件处理助手”这款Windows桌面端软件,掌握pycharm环境下使用PySide6开发桌面端软件、并打包发布的整个流程。
1.1、项目简介:
想转就转批量文件处理助手,使用pyside6进行图形界面开发,支持「批量查找并处理」、「批量重命名」、「文件夹比对」、「批量提取文件名」、「文件大小排序」等功能。
1.1.1、软件主界面
1.1.2、主窗口分2个区:左侧菜单区、右侧工作区
「查找并处理」界面:
、「重命名」、「文件夹比对」、「提取文件名」、「大小排序」
二、项目架构
2.1、开发设备
Windows10 64位电脑
2.2、开发工具
PyCharm Community Edition 2022.1.1、Python 3.8.10、PySide6、Pyinstaller、auto-py-to-exe
2.3、技术点
UI设计: 使用pyside6-designer.exe设计,
Ui编译:使用pyside6-uic.exe编译成py文件,
逻辑功能实现:Python
主要第三软件:SubtitleEdit.exe
项目打包:auto-py-to-exe
2.4、项目搭建
2.4.0、构建项目虚拟环境
Pycharm打开后,在File菜单选择New Project,打开界面,新建项目名Subtitle_Assistant,同时新建一个Base interpreter为Python 3.8的虚拟环境venv,如下:
2.4.1、pyside6配置:
Pycharm终端Terminal,虚拟环境下输入:pip install pyside6==6.4.3 回车后等待安装成功:Successfully installed PySide6-6.4.3 PySide6-Addons-6.4.3 PySide6-Essentials-6.4.3 shiboken6-6.4.3
2.4.2、配置外部工具pyside6-designer.exe、pyside6-uic.exe、Pyside6-rcc.exe
参考:PySide6开发实战案例:艺术签名助手_pyside6 window程序开发-CSDN博客
2.4.3、项目结构
入口函数,位于app.py里的main函数。其中,
img存放图标图片文件;
src文件夹存放各模块程序源代码文件;
ui文件夹存放pyside designer设计的ui 文件;
venv文件夹为项目虚拟环境文件夹;
三、模块功能实现:
3.1、主界面
3.1.1、界面UI
在Pycharm中打开Tools菜单进入External Tools,选择使用pyside6-designer.exe设计主窗口界面,保存为 index.ui文件。
3.1.2、UI转py文件
index.ui文件完成后使用pyside6-uic.exe编译成 ui_index.py文件,供src/index_module/index.py文件引入,补充界面设计,并添加业务逻辑。
3.2、查找并处理模块
3.2.1、界面UI
在Pycharm中打开Tools菜单进入External Tools,选择使用pyside6-designer.exe设计页面,保存为 find_and_batch_page.ui 文件。
find_and_batch_page.ui部件为垂直布局verticalLayout,它又分为上下两块:上部图片显示部件,下部为水平布局的按钮参数设置区域。
其他模块类似
四、核心代码:
4.1、find_and_batch_page.py的代码:
# -*- coding: utf-8 -*-
'''
查找并处理页面:
右边工作区显示“查找并处理”页面,并在页面操作:
1、在“查找文件夹”处,点击“打开文件夹”按钮,选择要查找的目标文件夹路径,显示到文本输入框“folder_dir_show_lineEdit”;
2、点击“待查找文件名清单”对应“添加文件”按钮,添加待查找的文件名清单,显示到文本框“file_name_list_wait_find_textEdit”;
3、选择“查找方式”对应的选项,比如“文件名相同”、“包含文件名”、“文件名格式都相同”;
4、选择“处理方式”对应的选项,比如“复制”、“移动”、“删除”;
5、在“输出路径”,点击“另存为”按钮,选择最终文件要保存的文件夹路径;
6、点击“开始查找并处理”按钮,执行从“要查找的目标文件夹”中,查找并执行处理“待查找文件名清单”中的文件。
'''
import datetime
import os
import shutil
from PySide6.QtCore import (Qt)
from PySide6.QtWidgets import (QHeaderView, QTableWidgetItem, QWidget, QFileDialog, QMessageBox, QButtonGroup)
from src.decorators import validate_and_modify_regular_member_times, enable_decorator_on_datetime
# 从src/handle_module/handle.py导入HandleWidget部件类
from src.handle_module.handle import HandleWidget
from src.utils import GetDesktopPath, get_folder_file_paths, get_name_and_ext_from_filename
# 首先,用外部工具pyside6-designer.exe设计外观界面,保存为 find_and_batch_page.ui,
# 然后用pyside6-uic.exe编译生成py文件:ui_find_and_batch_page.py,从它里面导入里面的 Ui_find_and_batch_page 类
from src.find_and_batch_page_module.ui_find_and_batch_page import Ui_find_and_batch_page
# 查找并处理页面类,继承ui界面类 Ui_find_and_batch_page
class FindAndBatchPage(QWidget, Ui_find_and_batch_page):
# 关键字参数parent 父级,设置为主窗口
def __init__(self, parent=None):
super().__init__()
# 安装设计好的外观界面Ui
self.setupUi(self)
self.parent = parent
# # 将所有”查找方式“单选按钮添加进”查找方式“按钮组
self.find_way_btn_group = QButtonGroup()
self.find_way_btn_group.addButton(self.same_file_name_radioButton)
self.find_way_btn_group.addButton(self.include_file_name_radioButton)
self.find_way_btn_group.addButton(self.same_file_name_and_extension_radioButton)
# # 设置”查找方式“默认勾选按钮为“文件名相同”
self.same_file_name_radioButton.setChecked(True)
# # 将所有”处理方式“单选按钮添加进”处理方式“按钮组
self.process_method_btn_group = QButtonGroup()
self.process_method_btn_group.addButton(self.copy_radioButton)
self.process_method_btn_group.addButton(self.move_radioButton)
self.process_method_btn_group.addButton(self.delete_radioButton)
# # 设置”处理方式“默认勾选按钮为“复制”
self.copy_radioButton.setChecked(True)
# 页面选择的”查找方式“默认初值,“文件名相同”
self.find_way = "文件名相同"
# 页面选择的”处理方式“默认初值,“复制”
self.process_method = "复制"
# 目标文件夹文件路径字典,用于存储想要查找的文件夹下文件名以及文件路径
self.folder_file_path_dict = {}
# 待查找文件名清单列表“self.file_name_list_wait_find_list”
self.file_name_list_wait_find_list = []
# 表格行数据列表初值,用于表格tableWidget_2添加行数据
self.row_data_list = []
# 表格tableWidget_2拥有文件全路径字典,初值空(随插入删除动态变化)
# 用于显示查找到的文件名以及文件路径
self.file_path_dict_in_table = {}
# 初始化表格tableWidget_2
self.init_table()
# 信号绑定
self.bind()
# 绑定信号函数
def bind(self):
# 页面”打开文件夹“按钮点击信号,链接到函数 add_folder_dir_to_dict_and_show
self.open_folder_pushButton.clicked.connect(self.add_folder_dir_and_show)
# 页面”添加文件“按钮点击信号,链接到函数 add_file_name_list_wait_find_to_textEdit
self.add_file_name_list_wait_find_pushButton.clicked.connect(self.add_file_name_list_wait_find_to_textEdit)
# 页面”清空清单“按钮点击信号,链接到函数 clear_file_name_show_in_textEdit
self.clear_file_name_list_wait_find_pushButton.clicked.connect(self.clear_file_name_show_in_textEdit)
# 页面”另存为“按钮点击信号,链接到函数 another_save_out_dir
self.another_save_pushButton.clicked.connect(self.another_save_out_dir)
# 点击另存为旁边的”打开“按钮,打开“输出路径”对应的文件夹
self.out_dir_open_pushButton.clicked.connect(self.open_save_out_dir)
# 页面”清空表格“按钮点击信号,链接到函数 clear_table
self.clear_table_pushButton.clicked.connect(self.clear_table)
# 页面”开始查找并处理“按钮点击信号,链接到函数 start_find_batch
self.start_find_batch_pushButton.clicked.connect(self.start_find_batch)
# 初始化表格tableWidget_2,在添加文件数据之前
def init_table(self):
# 表格设置初始状态,行数初值1,允许添加行数最多20,列数固定4
# 设置表格的行数、列数
self.tableWidget_2.setRowCount(0)
self.tableWidget_2.setColumnCount(4)
# 设置水平表头标签
self.tableWidget_2.setHorizontalHeaderLabels(['匹配关键词', '输出文件名', '处理状态', '操作'])
# 单元格水平标题表头方向自动填满表格空间,设置表格为自适应的伸缩模式,即可根据窗口的大小来改变网格的大小
self.tableWidget_2.horizontalHeader().setSectionResizeMode(QHeaderView.ResizeMode.Stretch)
# 水平标题表头底部间隔线在windows10系统默认没有显示,这里可以设置背景色天蓝色、文字黑色
self.tableWidget_2.horizontalHeader().setStyleSheet(
"QHeaderView::section{background:skyblue;color: black;}")
# 每次点击”打开文件夹“按钮,选择要查找的目标文件夹,将文件夹路径显示到文本输入框“folder_dir_show_lineEdit”;
def add_folder_dir_and_show(self):
# 打开文件夹对话窗口,返回选中的文件路径
folder = self.get_open_folder_dialog()
print("打开文件夹folder:", folder)
if folder:
# 如果显示文件夹路径文本输入框“folder_dir_show_lineEdit”中存在相同的文件夹路径,则弹窗警告
if folder in self.folder_dir_show_lineEdit.text():
print('文件夹路径文本输入框“folder_dir_show_lineEdit”中存在相同的文件夹路径!')
# 弹出警告消息框提示
QMessageBox.warning(self, "警告", "文件夹路径已经添加过,请不要重复添加!")
return
# 如果显示文件夹路径文本输入框“folder_dir_show_lineEdit”中不存在相同的文件夹路径,则添加显示
else:
# 如果文本输入框folder_dir_show_lineEdit中为空,则表示第1次添加
if self.folder_dir_show_lineEdit.text() == '':
# 文件夹路径显示到文本输入框folder_dir_show_lineEdit
self.folder_dir_show_lineEdit.setText(folder+';')
# 如果文本输入框folder_dir_show_lineEdit中不为空,则表示第n>1次添加,中间用中文”;“隔开
else:
# 文件夹路径显示到文本输入框folder_dir_show_lineEdit
self.folder_dir_show_lineEdit.setText(self.folder_dir_show_lineEdit.text()+folder+';')
# 显示文件夹路径文本输入框“folder_dir_show_lineEdit”中对应的所有
# 文件夹内所有文件名以及文件路径存储进文件路径字典,并返回字典
def add_folder_file_dir_to_dict(self):
# 逐条获取文本输入框“folder_dir_show_lineEdit”中对应的文件夹路径
folder_dirs_str = self.folder_dir_show_lineEdit.text()
if folder_dirs_str != '':
folder_dirs_list = folder_dirs_str.split(';')
for folder_dir in folder_dirs_list:
print('查找文件夹路径:', folder_dir)
# 获取文件夹内所有文件路径,存入字典
return get_folder_file_paths(folder_dir)
# 每次点击待查找文件名清单对应的”添加文件“按钮,选择待查找文件名清单文件(txt格式),
# 读取待查找的文件名清单到待查找文件名清单列表“self.file_name_list_wait_find_list”,
# 同时显示到文本框“self.file_name_list_wait_find_textEdit”;
# 输出路径对应”文本输入框“设置默认保存路径
def add_file_name_list_wait_find_to_textEdit(self):
# 临时文本字符串变量,初值空
text_content = ''
# 打开文件对话窗口,返回选中的文件路径
file_name_list_wait_find_file_path = self.get_open_file_dialog()
# 如果待查找的文件名清单文件存在,则
if file_name_list_wait_find_file_path:
print('待查找文件名清单文件路径:', file_name_list_wait_find_file_path)
# 从 file_name_list_wait_find_file_path 中逐行读取 查找文件名
# 1、有记录,则读取记录,添加到待查找文件名清单列表“self.file_name_list_wait_find_list”;
# 2、没有记录,则弹出警告提醒
with open(file_name_list_wait_find_file_path, 'r', encoding='utf-8') as file:
lines = file.readlines()
# 有记录,则读取记录显示待查文件名清单,
if len(lines) > 0:
for line in lines:
# 去除换行符和首尾空格
line_strip = line.strip('\n').strip()
if line_strip != '':
print('待查找文件名清单列表添加待查文件名:', line_strip)
# “待查文件名”添加到待查找文件名清单列表“self.file_name_list_wait_find_list”;
self.file_name_list_wait_find_list.append(line_strip)
# 将每一行添加到临时文本字符串变量 text_content 末尾
text_content += line_strip + '\n'
# 将文件名清单内容text_content显示到文本框“file_name_list_wait_find_textEdit”
self.file_name_list_wait_find_textEdit.setText(text_content)
# 设置“输出路径”文本输入框默认值
self.set_out_dir()
# 没有记录,则弹出警告提醒
else:
# 弹出警告消息框提示
QMessageBox.warning(self, "警告", "待查找文件名清单中没有文件名!")
return
# 每次点击待查找文件名清单后对应的”清空清单“按钮,则清空文本框“file_name_list_wait_find_textEdit”中显示的待查找文件名清单;
# 同时,清空待查找文件名清单列表“self.file_name_list_wait_find_list”中的信息
def clear_file_name_show_in_textEdit(self):
self.file_name_list_wait_find_textEdit.setText('')
self.file_name_list_wait_find_list.clear()
# 打开文件对话框
def get_open_file_dialog(self):
# 打开文件对话框,getOpenFileName(父项,标题,路径,文件类型过滤器)参数:dir打开路径为当前路径"."
# 返回:result为文件路径信息、type文件过滤类型
result, filter_type = QFileDialog.getOpenFileName(self, "选择文件", ".", "文件(*.txt)")
return result
# 打开文件夹对话框,返回文件夹全路径
def get_open_folder_dialog(self):
# 打开文件夹对话框,getExistingDirectory(父项,标题,路径)参数:dir打开路径为当前路径"."
# 返回:result为文件全路径
result = QFileDialog.getExistingDirectory(self, "选择文件夹", ".")
return result
# 清空表格函数,当表格清空后,表格拥有文件路径信息字典也清空
def clear_table(self):
# 删除所有行
while self.tableWidget_2.rowCount() > 0:
self.tableWidget_2.removeRow(0)
# 清空表格拥有文件路径信息字典
self.file_path_dict_in_table = {}
# 为所有添加的文件设置统一的“输出路径”文本输入框默认值
def set_out_dir(self):
# 默认“输出文件”路径:桌面路径构建文件夹“aizhuanhuan”
out_dir = os.path.join(GetDesktopPath(), "aizhuanhuan")
self.out_dir_lineEdit.setText(out_dir)
# 点击”另存为“按钮,修改“输出路径”文本输入框值
def another_save_out_dir(self):
# 打开已存在路径,返回:result为路径
new_out_dir = QFileDialog.getExistingDirectory(self, "另存为文件夹", ".")
if new_out_dir is not None:
self.out_dir_lineEdit.setText(new_out_dir)
# 点击另存为旁边的”打开“按钮,打开“输出路径”对应的文件夹
def open_save_out_dir(self):
out_dir = os.path.abspath(self.out_dir_lineEdit.text())
print('准备打开输出文件夹:', out_dir)
os.startfile(f'{out_dir}')
# 从”查找文件夹“中,按照”查找方式“,查找出”待查找文件名清单“里的文件,
# 将找到的单个文件信息插入到表格中,同时将插入成功的文件信息存入表格拥有文件全路径字典self.file_path_dict_in_table
def find_and_insert_one_row_to_table(self, find_way):
# 获取”查找文件夹“对应文本输入框“folder_dir_show_lineEdit”中对应的所有
# 文件夹内所有文件名以及文件路径,存储进目标文件夹文件路径字典self.folder_file_path_dict
self.folder_file_path_dict = self.add_folder_file_dir_to_dict()
# 待查找文件名清单列表“self.file_name_list_wait_find_list”
# 按照‘查找方式’为find_way,遍历待查找文件名清单列表中文件名,
# 去目标文件夹文件路径字典中的”键名“匹配查找,
# 匹配到一个文件,则将该文件信息插入到表格tableWidget_2中的一行中
for file_name_1 in self.file_name_list_wait_find_list:
# print("待查文件名file_name_1:", file_name_1)
# 遍历目标文件夹文件路径字典
for file_name_2, file_path2 in self.folder_file_path_dict.items():
# print("目标文件夹文件路径字典中键名file_name_2:", file_name_2)
# print("目标文件夹文件路径字典中键值file_path2:", file_path2)
# 分别获取文件名file_name_1、file_name_2的名和扩展
only_name1, extension1 = get_name_and_ext_from_filename(file_name_1)
only_name2, extension2 = get_name_and_ext_from_filename(file_name_2)
# =============查找方式“文件名相同”
if find_way == '文件名相同':
if only_name1 == only_name2:
print("匹配到文件名相同的文件:", file_name_2)
# 匹配到的文件名及路径信息存入表格拥有文件全路径字典self.file_path_dict_in_table,
# 同时插入到表格tableWidget_2中的一行中,
self.insert_one_row_to_table(only_name1, file_path2) # only_name1作为匹配关键词
print("匹配到文件信息存入字典并插入表格")
# =============查找方式“包含文件名”
elif find_way == '包含文件名':
if only_name1 in only_name2:
print(f"匹配到包含文件名{only_name1}的文件:", file_name_2)
# 匹配到的文件名及路径信息存入表格拥有文件全路径字典self.file_path_dict_in_table,
# 同时插入到表格tableWidget_2中的一行中,
self.insert_one_row_to_table(only_name1, file_path2) # only_name1作为匹配关键词
print("匹配到文件信息存入字典并插入表格")
# =============查找方式“文件名和格式都相同”
elif find_way == '文件名和格式都相同':
if file_name_1 == file_name_2:
print(f"匹配到文件名和格式都相同的文件:", file_name_2)
# 匹配到的文件名及路径信息存入表格拥有文件全路径字典self.file_path_dict_in_table,
# 同时插入到表格tableWidget_2中的一行中,
self.insert_one_row_to_table(only_name1, file_path2) # only_name1作为匹配关键词
print("匹配到文件信息存入字典并插入表格")
# 匹配到的单个文件信息插入到表格tableWidget_2中,同时存入表格拥有文件全路径字典self.file_path_dict_in_table,
# 参数:匹配关键词key_name、文件路径file_path
# ['匹配关键词', '输出文件名', '处理状态', '操作']
def insert_one_row_to_table(self, key_name, file_path):
out_file_name = os.path.basename(file_path) # 输出文件名
handle_status = "待处理" # 处理状态,初值为“待处理”
handle = None # 操作,包含2个图标:预览、删除
# filePath文件数据添加进行数据列表self.row_data_list
self.row_data_list = [key_name, out_file_name, handle_status, handle]
# 当前表格中的行数,初始化的时候为1
row_count = self.tableWidget_2.rowCount()
# 往表格中插入一行数据
self.tableWidget_2.insertRow(row_count)
# 刚插入的这一行添加行数据列表self.row_data_list数据
for i, item in enumerate(self.row_data_list):
# handle字段对应单元格内添加一个HandleWidget类部件,即该行索引为3的列
if i == 3:
# 创建一个HandleWidget类对象,参数父级设置为表格
handle_widget = HandleWidget(parent=self.tableWidget_2,
row_index=row_count,
column_index=i, file_path=file_path)
self.tableWidget_2.setCellWidget(row_count, i, handle_widget)
# 其余单元格内,添加前面设置好的文本数据
else:
# 单元格对齐方式:居中对齐
item = QTableWidgetItem(item)
item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
# 设置行、列的单元格数据
self.tableWidget_2.setItem(row_count, i, item)
# 将插入成功的文件信息存入表格拥有文件全路径字典self.file_path_dict_in_table
self.file_path_dict_in_table[out_file_name] = file_path
# 点击”开始查找并处理“按钮,将按照”查找方式“查找出的文件显示到表格上,
# 同时,按照”处理方式“对表格中所有的文件逐条进行处理,
# 处理过程中,“开始查找并处理”按钮不可用,
# 正在处理的行的“处理状态”字段值设置由“待处理”修改为“处理中...”,
# 处理完成后,该行对应转换好的文件保存到“输出路径”下,保存文件名为“输出文件名”;
# 处理完成后,该行的“处理状态”字段值设置由“处理中...”修改为“处理完成!”,
# 处理完成后,“开始查找并处理”按钮可用!
# enable_decorator_on_datetime、validate_and_modify_regular_member_times为装饰器函数,用于验证当前用户是否有效,有效则运行被装饰函数,无效则不允许运行。
@enable_decorator_on_datetime(target_datetime=datetime.datetime(2024, 6, 1, 8, 30, 0), decorator_to_apply=validate_and_modify_regular_member_times)
def start_find_batch(self):
# 获取”查找方式“单选按钮组选中的按钮文本
self.find_way = self.find_way_btn_group.checkedButton().text()
print('”查找方式“为:', self.find_way)
# 调用find_and_insert_one_row_to_table(self, find_way)
# 从”查找文件夹“中,按照”查找方式“,查找出”待查找文件名清单“里的文件,
# 将找到的单个文件信息插入到表格中,同时将插入成功的文件信息存入表格拥有文件全路径字典 self.file_path_dict_in_table
self.find_and_insert_one_row_to_table(self.find_way)
# 获取”处理方式“单选按钮组选中的按钮文本
self.process_method = self.process_method_btn_group.checkedButton().text()
print('”处理方式“为:', self.process_method)
# 如果表格中有匹配到的文件路径信息,且是待处理状态,则对待处理进行处理
if self.tableWidget_2.rowCount() > 0:
# 遍历表格tableWidget_2中所有行
for row_index in range(self.tableWidget_2.rowCount()):
# 判断row_index行是否为待处理文件:
# 如果是待处理,则从表格拥有文件路径信息字典 self.file_path_dict_in_table 中获取该行文件的全路径
if self.tableWidget_2.item(row_index, 2).text() == "待处理":
# row_index行‘处理状态’字段值设置由“待处理”修改为“处理中...”
self.set_handle_status_item(row_index, "处理中...")
# 获取该行文件对应的 “输出文件名” out_file_name
out_file_name_wait_handle = self.tableWidget_2.item(row_index, 1).text()
# 该行文件文件路径
file_path_wait_handle = self.file_path_dict_in_table[out_file_name_wait_handle]
# 输出文件夹路径
out_folder = self.out_dir_lineEdit.text()
# 输出文件夹路径不存在则创建
if not os.path.isdir(out_folder):
os.makedirs(out_folder)
# 处理结果状态标志,初值False
result_state = False
# ======如果”处理方式“为“复制”
if self.process_method == '复制':
# 将 row_index 行文件复制到输出路径
print(f"将文件{out_file_name_wait_handle}复制到输出路径")
# 构建目标文件完整路径
dist_file_path = os.path.join(out_folder, out_file_name_wait_handle)
try:
# 调用shutil库的copy函数进行文件复制,返回复制后的路径
return_result = shutil.copy(file_path_wait_handle, dist_file_path)
# 如果返回的文件路径存在文件,则成功
if os.path.isfile(return_result):
result_state = True
print("文件成功复制!")
except FileNotFoundError:
print("未找到指定的文件或路径错误!")
except Exception as e:
print("发生了其他错误:", str(e))
# ======如果”处理方式“为“移动”
elif self.process_method == '移动':
# 将 row_index 行文件移动到输出路径
print(f"准备将文件{out_file_name_wait_handle}移动到输出路径")
try:
# 判断文件是否存在
if not os.path.exists(file_path_wait_handle):
print("源文件不存在!")
else:
# 构建目标文件完整路径
dist_file_path = os.path.join(out_folder, out_file_name_wait_handle)
# 移动文件,返回移动后的路径
return_result = shutil.move(file_path_wait_handle, dist_file_path)
# 如果返回的文件路径存在文件,则移动成功
if os.path.isfile(return_result):
result_state = True
print("文件已成功移动到目标位置!")
except Exception as e:
print("发生错误:", str(e))
# ======如果”处理方式“为“删除”
elif self.process_method == '删除':
# 将 row_index 行文件删除
print(f"准备将文件{out_file_name_wait_handle}删除")
try:
# 判断路径是否存在
if os.path.exists(file_path_wait_handle):
# 删除文件, 返回值0则成功
os.remove(file_path_wait_handle)
result_state = True
print("成功删除文件!")
else:
print("路径不存在!")
except Exception as e:
print("发生错误:", str(e))
# 如果result_state为真,则表明“处理完成”
if result_state:
# 表格中“处理状态”字段单元格值设置由“处理中...”修改为“处理完成!”
self.set_handle_status_item(row_index, "处理完成!")
else:
# 表格中“处理状态”字段单元格值设置由“处理中...”修改为“出错啦!”
self.set_handle_status_item(row_index, "出错啦!")
# 如果表格中没有分享链接信息,则弹出警告
else:
# 弹出警告消息框提示
QMessageBox.warning(self, "警告", "没有查找到匹配的文件!")
# 修改表格中row_index行的“处理状态”字段单元格对应值
def set_handle_status_item(self, row_index, item_value):
# 表格中“处理状态”字段值设置为item_value
item = QTableWidgetItem(item_value)
item.setTextAlignment(Qt.AlignmentFlag.AlignCenter)
# 设置row_index行、column_index列的单元格数据为item
self.tableWidget_2.setItem(row_index, 2, item)
五、打包项目:
参考:PySide6开发实战案例:艺术签名助手_pyside6 window程序开发-CSDN博客
打包后的软件下载地址: 想转就转批量文想转就转批量文件处理助手