回顾上一个章节【第一章】桌面文件太乱?Python全自动文件整理术:批量重命名,1小时工作秒变1分钟,我们牛刀小试了一下。
我们分析了第一个python自动化的程序,实现了在桌面按照日期格式建立一个文件夹。
同时我们写了第二个python程序,将一个文件夹内文件,实现了自定义批量重命名。
接下来继续我们的全自动文件整理,这篇文章一方面将批量命名剩余功能完善,另一方面开始智能分类。
1.修改为带有日期的文件名:让你的文件自带“生产日期”(按创建/修改日期重命名)
痛点场景: 你有很多扫描件、会议纪要、工作日志,它们的文件名没有日期,或者日期格式不统一。当你想按时间顺序查找时,就非常麻烦。
实现思路: 和之前批量重命名文件类似
1.1 通过输入路径,利用python os 函数,批量读取文件夹文件,形成列表
1.2 对列表进行遍历循环,找到创建时间,如果没有创建时间,找到修改时间,获取时间信息
1.3 在列表中将名字和扩展分开,最后重命名加上时间戳。
具体代码实现:
import os
import datetime
def batch_rename_by_date(folder_path, date_type="modify", date_format="%Y%m%d_"):
"""
批量重命名指定文件夹下的文件,按创建或修改日期命名。
:param folder_path: 要处理的文件夹路径
:param date_type: 日期类型,"create"为创建日期,"modify"为修改日期
:param date_format: 日期格式,例如 "%Y%m%d_" 生成 "20231027_"
"""
if not os.path.exists(folder_path):
print(f"❌ 文件夹不存在:{folder_path}")
return
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
print(f"🚀 正在批量按日期重命名 '{folder_path}' 下的文件...")
for filename in files:
old_path = os.path.join(folder_path, filename)
try:
# 获取文件时间戳
if date_type == "create":
timestamp = os.path.getctime(old_path) # 创建时间
else: # 默认为 modify
timestamp = os.path.getmtime(old_path) # 修改时间
dt_object = datetime.datetime.fromtimestamp(timestamp)
date_prefix = dt_object.strftime(date_format)
name, ext = os.path.splitext(filename)
new_name = f"{date_prefix}{name}{ext}" # 新文件名:日期前缀 + 原文件名 + 扩展名
new_path = os.path.join(folder_path, new_name)
# 处理重名:如果新文件名已存在,可以加上一个递增数字或跳过
counter = 1
original_new_path = new_path
while os.path.exists(new_path):
new_name = f"{date_prefix}{name}({counter}){ext}"
new_path = os.path.join(folder_path, new_name)
counter += 1
os.rename(old_path, new_path)
print(f"✅ 重命名:'{filename}' -> '{new_name}'")
except PermissionError:
print(f"⚠️ 权限不足,无法重命名文件:'{filename}'。请检查文件是否被占用。")
except Exception as e:
print(f"❌ 重命名失败:'{filename}'。错误信息:{e}")
print("✨ 批量按日期重命名完成!")
if __name__ == "__main__":
# 请修改为你要整理的文件夹路径
target_folder = os.path.expanduser("~/Desktop/待整理文档")
batch_rename_by_date(target_folder, date_type="modify", date_format="%Y%m%d_")
操作步骤
- 和之前一样,我们为了简化操作,还是使用 之前文件夹作为演示, D:\旅行
3建立一个新的python文件名字为ModifyFileNameByTime.py,将上面代码粘贴进去。并且修改传入文件夹路径,如下图所示
最后运行结果为:
2.对已有文件名称统一化修改:批量添加、删除、替换特定字符(告别下载前缀,统一命名规范)
痛点场景: 你下载的文件名总是带有各种奇怪的前缀或后缀,比如[下载]_报告.pdf、XXX网站_图片.jpg。或者你的项目文件命名不规范,需要批量替换某个关键词。
实现的思路:
1 同上一个例子相似,显示获取文件列表
2 给出了四种不同修改文件名方案
2.1可以向前插入字符串
2.2 可以向后插入字符串
2.3 可以 删除指定字符串
2.4 可以对字符串进行替换
2.5 可以利用正则表达式自定义替换字符串
3 用户输入指定文件夹啊,需要替换的字符串,程序会自动替换。
代码演示
import os
import re # 导入正则表达式模块
def batch_rename_by_char_op(folder_path, operation_type="replace", old_str="", new_str="", regex_pattern=None):
"""
批量重命名文件:添加、删除或替换文件名中的特定字符。
:param folder_path: 要处理的文件夹路径
:param operation_type: 操作类型 "add_prefix", "add_suffix", "remove_str", "replace", "regex_replace"
:param old_str: 待替换的旧字符串(replace, remove_str)
:param new_str: 替换后的新字符串(replace, add_prefix, add_suffix)
:param regex_pattern: 正则表达式模式(regex_replace)
"""
if not os.path.exists(folder_path):
print(f"❌ 文件夹不存在:{folder_path}")
return
files = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f))]
print(f"🚀 正在批量处理 '{folder_path}' 下的文件名字符...")
for filename in files:
name, ext = os.path.splitext(filename)
new_name = name # 初始新名称为原名称部分
if operation_type == "add_prefix":
new_name = f"{new_str}{name}"
elif operation_type == "add_suffix":
new_name = f"{name}{new_str}"
elif operation_type == "remove_str":
new_name = name.replace(old_str, "")
elif operation_type == "replace":
new_name = name.replace(old_str, new_str)
elif operation_type == "regex_replace" and regex_pattern:
try:
new_name = re.sub(regex_pattern, new_str, name)
except re.error as e:
print(f"❌ 正则表达式错误:{e}")
continue
else:
print("⚠️ 未知的操作类型或缺少参数。")
continue
final_new_name = f"{new_name}{ext}"
old_path = os.path.join(folder_path, filename)
new_path = os.path.join(folder_path, final_new_name)
# 处理重名:如果新文件名已存在,添加计数器
counter = 1
original_final_new_name = final_new_name
while os.path.exists(new_path) and new_path != old_path: # 确保不是文件本身
final_new_name = f"{new_name}({counter}){ext}"
new_path = os.path.join(folder_path, final_new_name)
counter += 1
try:
os.rename(old_path, new_path)
print(f"✅ 重命名:'{filename}' -> '{final_new_name}'")
except PermissionError:
print(f"⚠️ 权限不足,无法重命名文件:'{filename}'。请检查文件是否被占用。")
except Exception as e:
print(f"❌ 重命名失败:'{filename}'。错误信息:{e}")
print("✨ 批量处理文件名字符完成!")
if __name__ == "__main__":
target_folder = os.path.expanduser("~/Desktop/下载文件")
# 示例1:移除文件名中的 "[下载]_" 前缀
# batch_rename_by_char_op(target_folder, operation_type="remove_str", old_str="[下载]_")
# 示例2:替换文件名中的 "old_version" 为 "new_version"
# batch_rename_by_char_op(target_folder, operation_type="replace", old_str="old_version", new_str="new_version")
# 示例3:使用正则表达式,移除文件名中所有 "(数字)" 的后缀,如 "报告(1).docx" -> "报告.docx"
batch_rename_by_char_op(target_folder, operation_type="regex_replace", regex_pattern=r"\(\d+\)", new_str="")
操作步骤:
2.1.和之前一样,我们还是将D:\旅行 作为输入文件夹
2.2 .我们可以新建立一个python文件,名字为ModifyFileNameByCustom.py,将上面的代码粘贴进去
2.3 可以看一下现在的文件夹中文件,我增加了两个右面有数字的
2.4 我们运行这段程序
2.5 可以看到结果:
也可看到最终界面结果
程序运行一切正常。
3 智能文件分类:Python自动归档你的图片、文档和视频!
接下来,是Python文件整理的另一大核心功能——文件自动分类。
我们将实现一个智能的图片分类脚本,将你的所有图片自动归类。
同样,针对文档分类,Python也能帮你轻松搞定。
通过编写Python自动整理桌面文件的脚本,你的桌面管理自动化将不再是梦想
核心理念: 我们需要的不仅仅是可以重命名,真正的Python文件整理需要像一个智能管家,根据文件类型、日期、甚至内容,自动把文件扔到对应的“房间”里。
3.1 扩展名魔术:Python帮你秒分“图片”、“文档”、“视频”到指定文件夹!
痛点场景: 你的下载文件夹里,图片、文档、安装包混杂,每次找文件都得滚动很久。
实现的核心思路:
3.1.1我们需要将常见文件扩展名都整理出来,比如jpg,jpeg,gif,mov,mp3,mp4,doc 等等
3.1.2 我们可以像之前一样扫描文件夹,根据文件后缀,就可以知道属于那个类型的文件
3.1.3通过python自动建立对应的目录,将刚才筛选出来的文件放到对应的目录
代码实现:
i
mport os
import shutil # 用于文件移动
def classify_by_extension(source_folder, target_base_folder):
"""
根据文件扩展名将文件分类移动到指定子文件夹。
:param source_folder: 源文件夹路径
:param target_base_folder: 目标根文件夹路径(分类后的子文件夹将在此目录下创建)
"""
if not os.path.exists(source_folder):
print(f"❌ 源文件夹不存在:{source_folder}")
return
# 定义分类规则:扩展名 -> 目标子文件夹名称
# 你可以根据自己的需要添加或修改
classify_rules = {
# 图片
(".jpg", ".jpeg", ".png", ".gif", ".bmp", ".tiff"): "Images",
# 文档
(".pdf", ".doc", ".docx", ".txt", ".rtf", ".ppt", ".pptx", ".xls", ".xlsx"): "Documents",
# 视频
(".mp4", ".mov", ".avi", ".mkv", ".flv"): "Videos",
# 压缩文件
(".zip", ".rar", ".7z", ".tar", ".gz"): "Archives",
# 应用程序/安装包
(".exe", ".dmg", ".app", ".apk"): "Applications",
# 其他(可以自行添加)
(".mp3", ".wav"): "Audio",
(".py", ".js", ".html", ".css"): "CodeFiles"
}
os.makedirs(target_base_folder, exist_ok=True) # 确保目标根文件夹存在
files = [f for f in os.listdir(source_folder) if os.path.isfile(os.path.join(source_folder, f))]
print(f"🚀 正在智能分类 '{source_folder}' 下的文件...")
for filename in files:
name, ext = os.path.splitext(filename)
ext = ext.lower() # 将扩展名转为小写,方便匹配
moved = False
for extensions, target_subdir_name in classify_rules.items():
if ext in extensions:
target_subdir_path = os.path.join(target_base_folder, target_subdir_name)
os.makedirs(target_subdir_path, exist_ok=True) # 确保子文件夹存在
source_path = os.path.join(source_folder, filename)
destination_path = os.path.join(target_subdir_path, filename)
# 处理重名文件:如果目标位置已存在同名文件,添加递增数字后缀
base_dest_name, dest_ext = os.path.splitext(destination_path)
counter = 1
while os.path.exists(destination_path):
destination_path = f"{base_dest_name}({counter}){dest_ext}"
counter += 1
try:
shutil.move(source_path, destination_path)
print(f"✅ 移动:'{filename}' -> '{target_subdir_name}/'")
moved = True
break # 文件已移动,跳出内层循环
except PermissionError:
print(f"⚠️ 权限不足,无法移动文件:'{filename}'。")
moved = True # 视为已处理,避免后续再次尝试
break
except Exception as e:
print(f"❌ 移动失败:'{filename}'。错误信息:{e}")
moved = True
break
if not moved:
# 如果文件类型不在规则中,可以移动到“Others”文件夹
other_folder = os.path.join(target_base_folder, "Others")
os.makedirs(other_folder, exist_ok=True)
try:
shutil.move(os.path.join(source_folder, filename), os.path.join(other_folder, filename))
print(f"➡️ 移动到 Others:'{filename}'")
except Exception as e:
print(f"❌ 移动到 Others 失败:'{filename}'。错误信息:{e}")
print("✨ 文件智能分类完成!")
if __name__ == "__main__":
source_dir = os.path.expanduser("~/Desktop/混乱文件") # 你的混乱文件目录
target_dir = os.path.expanduser("~/Documents/整理后文件") # 整理后的目标目录
# 确保源文件夹有测试文件,目标文件夹可以为空或不存在
# 建议手动创建一些混合类型的文件到 source_dir 进行测试
classify_by_extension(source_dir, target_dir)
实现步骤:
1创建文件ArrangeFile.py,粘贴上面代码
2建立一个混乱文件夹,包含音频,视频,文档,图片等
3建立一个整理后文件夹
4 执行运行
注意问题: 直接用D:\旅行\before,有可能报错,因为\b 是转义,需要修改为D:\旅行\before
效果展示
4 进阶分类:当文件没有扩展名怎么办?Python如何识别!
痛点场景: 有时候下载的文件没有扩展名(如某些网络缓存文件、Linux下传输的文件),或者你想
根据文件内容而非文件名来分类(比如识别一张图片是不是PNG,即使它没有.png后缀)。
工作原理:
其实我们可以通过python-magic 库 来识别文件头。换句话说,每个文件都有一个魔术头,只不过,肉眼但不到,需要通过解析文件内容,在二进制中会有一些特征。只要我们提取得到这些魔术头的特征,进行匹配就可以了。
4.1 我们依然是通过os来解析文件夹下面的文件
4.2 我们安装python-magic,集成到我们python环境中
4.3遍历循环,读取文件和魔术头对比
4.4 最终分类,让不同文件放置到不同目录。
演示代码:
import os
import shutil
import magic # 导入 python-magic 库
# 确保你已经安装了 python-magic 库:pip install python-magic-bin (Windows) 或 pip install python-magic (Linux/macOS)
def classify_by_magic(source_folder, target_base_folder):
"""
使用 python-magic 库识别文件类型并分类。
:param source_folder: 源文件夹路径
:param target_base_folder: 目标根文件夹路径
"""
if not os.path.exists(source_folder):
print(f"❌ 源文件夹不存在:{source_folder}")
return
os.makedirs(target_base_folder, exist_ok=True)
files = [f for f in os.listdir(source_folder) if os.path.isfile(os.path.join(source_folder, f))]
print(f"🚀 正在使用文件魔术识别并分类 '{source_folder}' 下的文件...")
for filename in files:
source_path = os.path.join(source_folder, filename)
try:
# 使用 python-magic 识别文件MIME类型
# 注意:在某些系统上,可能需要额外安装libmagic库
file_mime_type = magic.from_file(source_path, mime=True)
# 根据MIME类型映射到分类文件夹名称
# 你可以根据需要扩展这个映射表
target_subdir_name = "Others" # 默认分类
if file_mime_type.startswith("image/"):
target_subdir_name = "Images"
elif file_mime_type.startswith("application/pdf"):
target_subdir_name = "Documents/PDF"
elif file_mime_type.startswith("application/msword") or \
file_mime_type.startswith("application/vnd.openxmlformats-officedocument.wordprocessingml"):
target_subdir_name = "Documents/Word"
elif file_mime_type.startswith("application/vnd.ms-excel") or \
file_mime_type.startswith("application/vnd.openxmlformats-officedocument.spreadsheetml"):
target_subdir_name = "Documents/Excel"
elif file_mime_type.startswith("video/"):
target_subdir_name = "Videos"
elif file_mime_type.startswith("text/"):
target_subdir_name = "Texts"
elif file_mime_type.startswith("application/zip") or \
file_mime_type.startswith("application/x-rar"):
target_subdir_name = "Archives"
target_subdir_path = os.path.join(target_base_folder, target_subdir_name)
os.makedirs(target_subdir_path, exist_ok=True)
destination_path = os.path.join(target_subdir_path, filename)
# 处理重名
base_dest_name, dest_ext = os.path.splitext(destination_path)
counter = 1
while os.path.exists(destination_path):
destination_path = f"{base_dest_name}({counter}){dest_ext}"
counter += 1
shutil.move(source_path, destination_path)
print(f"✅ 移动:'{filename}' -> '{target_subdir_name}/' (识别为: {file_mime_type})")
except magic.MagicException as e:
print(f"❌ 识别文件类型失败:'{filename}'。错误信息:{e}")
# 可以选择移动到 Unknown 文件夹
unknown_folder = os.path.join(target_base_folder, "Unknown")
os.makedirs(unknown_folder, exist_ok=True)
try:
shutil.move(source_path, os.path.join(unknown_folder, filename))
print(f"➡️ 移动到 Unknown:'{filename}'")
except Exception as e_move:
print(f"❌ 移动到 Unknown 失败:'{filename}'。错误信息:{e_move}")
except PermissionError:
print(f"⚠️ 权限不足,无法移动文件:'{filename}'。")
except Exception as e:
print(f"❌ 移动失败:'{filename}'。错误信息:{e}")
print("✨ 文件魔术识别分类完成!")
if __name__ == "__main__":
source_dir = os.path.expanduser("~/Desktop/无名文件") # 你的无名文件目录
target_dir = os.path.expanduser("~/Documents/魔术识别整理") # 整理后的目录
# 建议手动创建一些没有扩展名但内容是图片/文档的文件,或者将现有文件扩展名删除进行测试。
# 例如:创建一个文本文档,保存为“测试文件”,然后删除其.txt扩展名。
classify_by_magic(source_dir, target_dir)
操作步骤
4.1 建立一个py文件,我们将它命名为MagicFile.py
4.2 需要导入magic ,我这里使用了pip install python-magic-bin pip install python-magic,两个都要安装
4.4 建立一个目录D:\旅行\magic ,同时将之前数据copy,去除后缀
4.5运行程序
4.6 最终结果现在,你不再需要手动拖拽、一个一个改名,你只需要轻轻一点,就能让1小时的文件整理工作缩短到1分钟,把宝贵的时间留给自己!
总结一下我们都做了哪些事情。
1 我们完成了对于文件夹文件,进行批量日期添加
2 对于下载或者重名文件,我们进行了文件名批量字符串替换
3 我们还对文件夹中文件进行了识别,根据后缀名字,分门别类的放置到对应目录。
4 针对没有文件扩展名的特殊情况,我们第一次引入了python-magic 根据文件内容进行识别
包含了源代码,截图,运行流程,代码中注意点,以及运行结果,我们进行了详细的演示。
同时我会将用到的文件进行打包上传。
喜欢这个主题的,可以进行关注,点赞和收藏,
到此结束了吗?
还远远不够,不能每次都点开vscode,每次都在修改代码? 这也太不方便了吧!
下一个章节,我会继续封装前面的功能,并亲手打造了一个高效的文件整理神器。期待您的关注。