Python办公—多个文件夹内文件—>移动至同一目录

专栏导读

在这里插入图片描述

  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手

  • 🏳️‍🌈 博客主页:请点击——> 一晌小贪欢的博客主页求关注

  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏求订阅

  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏求订阅

  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏求订阅

  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏

  • ❤️ 欢迎各位佬关注! ❤️

背景

有时候我们需要将多个目录(文件夹)中的各种文件进行统一复制到同一个文件夹内,但是一个一个文件夹操作实在太繁琐了,我们可以利用python中的

1、库的介绍

  • shutil 是 Python 的一个标准库,主要用于操作文件和目录的高级操作。它建立在 os 和 os.path 模块之上,提供了更方便的文件复制、移动、删除以及目录树的遍历等功能。

  • 具体内容请看:Python100个库分享之——shutil & os 库介绍

2、库的安装

用途安装
PyQt5界面设计pip install PyQt5 -i https://pypi.tuna.tsinghua.edu.cn/simple/
os获取绝对路径内置库无需安装
sys调用程序内置库无需安装
shutil用于文件移动\复制内置库无需安装

3、核心代码

  • ① 多层文件夹遍历

 for root, dirs, files in os.walk(self.src_folder):
    for f in files:
         ori = os.path.join(root, f)
         file_name, file_ext = os.path.splitext(f)
         relative_path = os.path.relpath(root, self.src_folder)
         new_name = f"{file_name}_{relative_path.replace(os.sep, '_')}{file_ext}"
         now = os.path.join(self.dest_folder, new_name)
  • ② 复制 \ 移动

shutil.copy(ori, now)
os.rename(ori, now)

4、完整代码

import os
import shutil
import sys
from PyQt5 import QtWidgets, QtGui, QtCore

class FileMover(QtCore.QThread):
    log_signal = QtCore.pyqtSignal(str)  # 定义信号,用于发送日志信息

    def __init__(self, src_folder, dest_folder, copy_files, move_files):
        super().__init__()
        self.src_folder = src_folder
        self.dest_folder = dest_folder
        self.copy_files = copy_files
        self.move_files = move_files

    def run(self):
        try:
            for root, dirs, files in os.walk(self.src_folder):
                for f in files:
                    ori = os.path.join(root, f)
                    file_name, file_ext = os.path.splitext(f)
                    relative_path = os.path.relpath(root, self.src_folder)
                    new_name = f"{file_name}_{relative_path.replace(os.sep, '_')}{file_ext}"
                    now = os.path.join(self.dest_folder, new_name)

                    count = 1
                    while os.path.exists(now):
                        new_name = f"{file_name}_{relative_path.replace(os.sep, '_')}_{count}{file_ext}"
                        now = os.path.join(self.dest_folder, new_name)
                        count += 1

                    if self.copy_files:
                        shutil.copy(ori, now)
                        self.log_signal.emit(f"{f}{root} 复制成功,新名称为:{new_name}")
                    elif self.move_files:
                        os.rename(ori, now)
                        self.log_signal.emit(f"{f}{root} 移动成功,新名称为:{new_name}")
            self.log_signal.emit("文件操作完成!")
        except Exception as e:
            self.log_signal.emit(f"错误:{str(e)}")

class FileOperationApp(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("文件操作工具")
        self.setGeometry(300, 300, 600, 400)

        # 源路径
        self.src_label = QtWidgets.QLabel("源文件夹路径:")
        self.src_path = QtWidgets.QLineEdit()
        self.src_button = QtWidgets.QPushButton("选择源文件夹")
        self.src_button.clicked.connect(self.select_src_folder)

        # 目标路径
        self.dest_label = QtWidgets.QLabel("目标文件夹路径:")
        self.dest_path = QtWidgets.QLineEdit()
        self.dest_button = QtWidgets.QPushButton("选择目标文件夹")
        self.dest_button.clicked.connect(self.select_dest_folder)

        # 复制和移动选项
        self.copy_check = QtWidgets.QCheckBox("复制文件")
        self.move_check = QtWidgets.QCheckBox("移动文件")

        # 执行按钮
        self.move_button = QtWidgets.QPushButton("执行操作")
        self.move_button.clicked.connect(self.start_move_files)

        # 日志输出框
        self.log_output = QtWidgets.QTextEdit()
        self.log_output.setReadOnly(True)

        # 布局设置
        layout = QtWidgets.QGridLayout(self)
        layout.addWidget(self.src_label, 0, 0)
        layout.addWidget(self.src_path, 0, 1)
        layout.addWidget(self.src_button, 0, 2)
        layout.addWidget(self.dest_label, 1, 0)
        layout.addWidget(self.dest_path, 1, 1)
        layout.addWidget(self.dest_button, 1, 2)
        layout.addWidget(self.copy_check, 2, 0)
        layout.addWidget(self.move_check, 2, 1)
        layout.addWidget(self.move_button, 3, 0, 1, 3)
        layout.addWidget(self.log_output, 4, 0, 1, 3)

    def select_src_folder(self):
        folder = QtWidgets.QFileDialog.getExistingDirectory(self, "选择源文件夹")
        if folder:
            self.src_path.setText(folder)

    def select_dest_folder(self):
        folder = QtWidgets.QFileDialog.getExistingDirectory(self, "选择目标文件夹")
        if folder:
            self.dest_path.setText(folder)

    def start_move_files(self):
        src_folder = self.src_path.text()
        dest_folder = self.dest_path.text()
        copy_files = self.copy_check.isChecked()
        move_files = self.move_check.isChecked()

        if not os.path.exists(src_folder) or not os.path.exists(dest_folder):
            QtWidgets.QMessageBox.critical(self, "错误", "源路径或目标路径不存在")
            return

        if not copy_files and not move_files:
            QtWidgets.QMessageBox.critical(self, "错误", "请选择是复制还是移动文件")
            return

        # 启动后台线程进行文件操作
        self.worker = FileMover(src_folder, dest_folder, copy_files, move_files)
        self.worker.log_signal.connect(self.update_log)  # 连接日志信号到更新日志的槽
        self.worker.start()

    def update_log(self, message):
        self.log_output.append(message)  # 在日志输出框中追加日志信息

# 主程序入口
app = QtWidgets.QApplication(sys.argv)
window = FileOperationApp()
window.show()
sys.exit(app.exec_())

总结

  • 希望对初学者有帮助

  • 致力于办公自动化的小小程序员一枚

  • 希望能得到大家的【一个免费关注】!感谢

  • 求个 🤞 关注 🤞

  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏

  • 求个 ❤️ 喜欢 ❤️

  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏

  • 求个 👍 收藏 👍

  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小庄-Python办公

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值