在开始编写代码之前,需要确保你的电脑上已经安装了Python环境。本方案将使用Python内置的os和shutil模块进行文件操作,并使用第三方库Pillow来读取图片的拍摄时间(EXIF信息),以便更精准地按日期整理日记。
1. 安装Python环境
如果你的电脑尚未安装Python,请访问Python官网下载安装包。下载地址为:https://www.python.org/downloads/。下载时请务必勾选"Add Python to PATH"选项,这将在系统环境变量中自动配置Python路径。
安装完成后,打开终端(Windows下为CMD或PowerShell,Mac下为Terminal),输入以下命令验证安装是否成功:
python --version
如果返回了版本号(例如Python 3.10.0),说明环境配置正确。
2. 安装依赖库
我们需要安装Pillow库来处理图片文件的元数据。在终端中执行以下命令进行安装:
pip install Pillow
我们将创建一个名为organize_diary.py的脚本。该脚本的核心逻辑是:遍历指定文件夹下的所有文件,提取每个文件的“最后修改时间”或“拍摄时间”,根据日期创建“年/月”格式的文件夹结构,并将文件移动到对应的文件夹中,同时重命名文件以确保文件名包含具体日期。
1. 创建脚本文件
在你的工作目录下新建一个文本文件,将其重命名为organize_diary.py,并使用任意代码编辑器(如VS Code、Notepad++)打开它。
2. 导入必要模块
在文件开头写入以下导入代码:
import os
import shutil
from datetime import datetime
from PIL import Image, UnidentifiedImageError
3. 定义日期提取函数
我们需要一个函数来获取文件的日期。对于图片文件,优先尝试获取EXIF拍摄时间;对于其他文件或非标准图片,则回退使用文件的系统修改时间。
def get_file_date(file_path):
尝试获取图片的EXIF拍摄时间
try:
with Image.open(file_path) as img:
exif_data = img._getexif()
if exif_data:
36867 是EXIF中DateTimeOriginal的标签
date_str = exif_data.get(36867)
if date_str:
EXIF时间格式通常为 "YYYY:MM:DD HH:MM:SS"
return datetime.strptime(date_str, "%Y:%m:%d %H:%M:%S")
except (UnidentifiedImageError, AttributeError, IOError):
pass
如果无法获取EXIF,使用文件系统修改时间
timestamp = os.path.getmtime(file_path)
return datetime.fromtimestamp(timestamp)
4. 定义主整理函数
这是脚本的核心部分,负责遍历文件、创建目录、移动文件并重命名。

def organize_diary(source_dir, target_dir):
确保目标目录存在
if not os.path.exists(target_dir):
os.makedirs(target_dir)
遍历源目录下的所有文件
for filename in os.listdir(source_dir):
file_path = os.path.join(source_dir, filename)
跳过目录,只处理文件
if not os.path.isfile(file_path):
continue
获取文件日期
file_date = get_file_date(file_path)
构建目标文件夹路径:目标目录/年/月
year_month = file_date.strftime("%Y/%m")
dest_folder = os.path.join(target_dir, year_month)
如果目标文件夹不存在,则创建
if not os.path.exists(dest_folder):
os.makedirs(dest_folder)
构建新文件名:原扩展名
使用时间戳确保文件名唯一
ext = os.path.splitext(filename)[1]
new_filename = file_date.strftime("%Y-%m-%d_%H-%M-%S") + ext
dest_file_path = os.path.join(dest_folder, new_filename)
处理文件名冲突(如果同一秒有多个文件)
counter = 1
while os.path.exists(dest_file_path):
new_filename = file_date.strftime("%Y-%m-%d_%H-%M-%S") + f"_{counter}" + ext
dest_file_path = os.path.join(dest_folder, new_filename)
counter += 1
移动文件
try:
shutil.move(file_path, dest_file_path)
print(f"已移动: {filename} -> {dest_file_path}")
except Exception as e:
print(f"移动失败 {filename}: {e}")
5. 添加程序入口
在脚本末尾添加执行代码。请将source_folder修改为你存放杂乱日记的实际路径,target_folder修改为你希望整理后保存的路径。
if __name__ == "__main__":
【注意】请将此处路径替换为你电脑上的实际路径
Windows路径示例: r"C:\Users\YourName\Documents\Diaries"
Mac路径示例: "/Users/YourName/Documents/Diaries"
source_folder = r"./my_diaries"
target_folder = r"./organized_diaries"
print(f"开始整理日记,源目录: {source_folder}")
organize_diary(source_folder, target_folder)
print("整理完成!")
代码编写完成后,按照以下步骤执行脚本,完成日记档案的自动化整理。
1. 准备测试数据
在脚本同级目录下创建一个名为my_diaries的文件夹,放入几张不同日期的照片或文本文件,用于测试脚本的分类效果。
2. 运行脚本
在终端中切换到脚本所在目录,然后执行以下命令:
python organize_diary.py
3. 查看结果
脚本运行完毕后,你会在目录下看到新生成的organized_diaries文件夹。打开该文件夹,你会发现文件已经按照“年/月”的层级结构自动归档。例如,2023年10月的文件会被移动到organized_diaries/2023/10/目录下,且文件名已被重命名为2023-10-15_14-30-00.jpg这样的标准格式,便于后续检索。
为了方便查阅,我们可以在整理完成后,自动生成一个Markdown格式的索引文件(README.md),列出所有已整理的文件清单。
1. 添加索引生成函数
将以下代码追加到organize_diary.py文件中:
def generate_index(target_dir):
index_path = os.path.join(target_dir, "README.md")
with open(index_path, "w", encoding="utf-8") as f:
f.write(" 日记档案索引\n\n")
遍历所有年份和月份文件夹
for year in sorted(os.listdir(target_dir)):
year_path = os.path.join(target_dir, year)
if not os.path.isdir(year_path):
continue
f.write(f" {year}年\n\n")
for month in sorted(os.listdir(year_path)):
month_path = os.path.join(year_path, month)
if not os.path.isdir(month_path):
continue
f.write(f" {month}月\n\n")
列出该月下的所有文件
files = sorted(os.listdir(month_path))
for file in files:
f.write(f"- {file}\n")
f.write("\n")
print(f"索引文件已生成: {index_path}")
2. 修改主程序入口
更新if __name__ == "__main__":部分的代码,在整理完成后调用索引生成函数:
if __name__ == "__main__":
source_folder = r"./my_diaries"
target_folder = r"./organized_diaries"
print(f"开始整理日记,源目录: {source_folder}")
organize_diary(source_folder, target_folder)
print("正在生成索引文件...")
generate_index(target_folder)
print("所有任务已完成!")
3. 最终验证
再次运行python organize_diary.py。任务完成后,打开organized_diaries文件夹,你会看到一个README.md文件。用文本编辑器打开它,你将看到一份结构清晰的文件目录树,所有日记按时间顺序排列,一目了然。