专栏导读
🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手 📕 此外还有python基础专栏:请点击——>Python基础学习专栏 求订阅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 ❤️ 欢迎各位佬关注! ❤️
背景
有时候我们需要将多个目录(文件夹)中的各种文件进行统一复制到同一个文件夹内,但是一个一个文件夹操作实在太繁琐了,我们可以利用python中的
1、库的介绍
shutil 是 Python 的一个标准库,主要用于操作文件和目录的高级操作。它建立在 os 和 os.path 模块之上,提供了更方便的文件复制、移动、删除以及目录树的遍历等功能。
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_( ) )
总结
希望对初学者有帮助 致力于办公自动化的小小程序员一枚 希望能得到大家的【一个免费关注】!感谢 求个 🤞 关注 🤞 求个 ❤️ 喜欢 ❤️ 求个 👍 收藏 👍