PySide6开发实战案例:批量文件处理助手

一、项目说明:

       最近碰到一些需要批量处理文件的问题,手动操作都比较费时费力,比如:

        (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博客

打包后的软件下载地址: 想转就转批量文想转就转批量文件处理助手

    

  • 15
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: Python通信调试助手是一个用于调试和测试通信协议的工具。根据引用\[1\]中提到的Python环境搭建,你可以使用PyCharm作为集成开发环境来编写Python代码。在PyCharm中,你可以选择不同版本的解释器来运行你的代码。你可以在File菜单下的Settings中选择Project Interpreter来切换解释器。如果你想使用Python3的解释器,PyCharm自带了Python3的解释器。另外,根据引用\[2\]中提到的清华源,你可以使用pip命令来安装一些常用的Python库,比如pyqt5、pyserial、pyinstaller等。如果你想在虚拟环境下安装pyinstaller包,可以使用命令"pip install pyinstaller"。最后,你可以使用pyinstaller命令来将你的Python代码打包成可执行文件,以便在没有Python环境的机器上运行。例如,你可以使用命令"pyinstaller -F --icon=Ucom.ico pyserial_demo.py -w"来打包一个名为pyserial_demo.py的Python文件。 #### 引用[.reference_title] - *1* [Python实现嵌入式网络调试助手](https://blog.csdn.net/geek_liyang/article/details/88891742)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [基于python+pyqt5的串口助手](https://blog.csdn.net/qq_40147893/article/details/125569698)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值