本文目录导读:

我来介绍几种Python批量移动文件的方法。
使用shutil模块(最常用)
import shutil
import os
from pathlib import Path
def batch_move_files(src_dir, dst_dir, file_extensions=None):
"""
批量移动文件
参数:
src_dir: 源目录
dst_dir: 目标目录
file_extensions: 要移动的文件扩展名列表,如['.txt', '.jpg']
"""
# 确保目标目录存在
Path(dst_dir).mkdir(parents=True, exist_ok=True)
# 遍历源目录
for filename in os.listdir(src_dir):
src_path = os.path.join(src_dir, filename)
dst_path = os.path.join(dst_dir, filename)
# 只处理文件,不处理目录
if os.path.isfile(src_path):
# 如果指定了扩展名过滤
if file_extensions:
ext = os.path.splitext(filename)[1].lower()
if ext not in file_extensions:
continue
try:
shutil.move(src_path, dst_path)
print(f"已移动: {filename}")
except Exception as e:
print(f"移动失败 {filename}: {e}")
# 使用示例
batch_move_files('./source', './destination', ['.txt', '.pdf'])
使用pathlib(现代Python推荐)
from pathlib import Path
import shutil
def batch_move_files_pathlib(src_dir, dst_dir, pattern="*"):
"""
使用pathlib批量移动文件
参数:
src_dir: 源目录
dst_dir: 目标目录
pattern: 文件匹配模式,如"*.txt", "*2024*"
"""
src_path = Path(src_dir)
dst_path = Path(dst_dir)
# 创建目标目录
dst_path.mkdir(parents=True, exist_ok=True)
# 遍历匹配的文件
for file_path in src_path.glob(pattern):
if file_path.is_file():
try:
shutil.move(str(file_path), str(dst_path / file_path.name))
print(f"已移动: {file_path.name}")
except Exception as e:
print(f"移动失败 {file_path.name}: {e}")
# 使用示例
batch_move_files_pathlib('./source', './destination', "*.jpg")
带进度显示
import shutil
import os
from pathlib import Path
from tqdm import tqdm # 需要安装: pip install tqdm
def batch_move_with_progress(src_dir, dst_dir, file_types=None):
"""
带进度条批量移动文件
"""
src_path = Path(src_dir)
dst_path = Path(dst_dir)
dst_path.mkdir(parents=True, exist_ok=True)
# 获取所有文件
files = [f for f in src_path.iterdir() if f.is_file()]
# 过滤文件类型
if file_types:
files = [f for f in files if f.suffix.lower() in file_types]
# 带进度条移动
for file_path in tqdm(files, desc="移动文件中"):
try:
shutil.move(str(file_path), str(dst_path / file_path.name))
except Exception as e:
print(f"\n移动失败 {file_path.name}: {e}")
# 使用示例
batch_move_with_progress('./source', './destination', ['.png', '.jpg'])
按文件类型分类移动
import shutil
import os
from pathlib import Path
def move_files_by_type(src_dir, dst_base_dir):
"""
按文件类型分类移动到不同文件夹
"""
src_path = Path(src_dir)
# 文件类型分类规则
type_folders = {
'.txt': 'text_files',
'.pdf': 'pdf_files',
'.jpg': 'image_files',
'.png': 'image_files',
'.docx': 'word_files',
'.xlsx': 'excel_files',
'.mp4': 'video_files',
'.mp3': 'audio_files',
}
for file_path in src_path.iterdir():
if file_path.is_file():
# 获取文件扩展名
ext = file_path.suffix.lower()
# 确定目标文件夹
folder_name = type_folders.get(ext, 'other_files')
dst_path = Path(dst_base_dir) / folder_name
# 创建目标文件夹
dst_path.mkdir(parents=True, exist_ok=True)
try:
shutil.move(str(file_path), str(dst_path / file_path.name))
print(f"已移动 {file_path.name} -> {folder_name}")
except Exception as e:
print(f"移动失败 {file_path.name}: {e}")
# 使用示例
move_files_by_type('./downloads', './sorted_files')
按日期移动文件
import shutil
import os
from pathlib import Path
from datetime import datetime
def move_files_by_date(src_dir, dst_base_dir):
"""
按文件创建日期移动文件
格式: YYYY/MM/DD
"""
src_path = Path(src_dir)
for file_path in src_path.iterdir():
if file_path.is_file():
# 获取文件修改时间
mtime = os.path.getmtime(file_path)
date = datetime.fromtimestamp(mtime)
# 创建按日期组织的路径:YYYY/MM/DD
date_path = Path(str(date.year)) / str(date.month).zfill(2) / str(date.day).zfill(2)
dst_path = Path(dst_base_dir) / date_path
# 创建目录
dst_path.mkdir(parents=True, exist_ok=True)
try:
shutil.move(str(file_path), str(dst_path / file_path.name))
print(f"已移动 {file_path.name} -> {date_path}")
except Exception as e:
print(f"移动失败 {file_path.name}: {e}")
# 使用示例
move_files_by_date('./photos', './organized_photos')
实用示例:移动特定大小的文件
import shutil
import os
from pathlib import Path
def move_large_files(src_dir, dst_dir, max_size_mb=10):
"""
移动大于指定大小的文件
"""
src_path = Path(src_dir)
dst_path = Path(dst_dir)
dst_path.mkdir(parents=True, exist_ok=True)
max_size_bytes = max_size_mb * 1024 * 1024
for file_path in src_path.iterdir():
if file_path.is_file():
file_size = file_path.stat().st_size
if file_size > max_size_bytes:
try:
shutil.move(str(file_path), str(dst_path / file_path.name))
size_mb = file_size / (1024 * 1024)
print(f"已移动大文件: {file_path.name} ({size_mb:.2f} MB)")
except Exception as e:
print(f"移动失败 {file_path.name}: {e}")
# 使用示例
move_large_files('./downloads', './large_files', max_size_mb=100)
注意事项
- 备份重要数据:移动操作不可逆,建议先测试
- 错误处理:添加异常处理,避免程序中断
- 文件冲突:可使用
os.path.exists()检查目标文件是否存在 - 权限问题:确保有足够的文件操作权限
这些方法可以根据你的具体需求选择和修改,需要我详细解释某个方法或帮您针对特定场景优化代码吗?
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播