用Python构建个人数字记忆库:纸短情长,代码映初心
简介
在数字时代,我们记录生活的方式早已从纸笔转向了比特与字节。每一张照片、每一段文字、每一次心跳数据,都是我们人生故事的“数字信笺”。这些散落各处的数据,就像一封封未整理的“情书”,需要我们用心归档、妥善保管。
本文将带你使用Python,从零开始构建一个简易的个人数字记忆库。我们将通过代码,实现从本地文件夹自动收集、分类、归档个人重要数字文件(如照片、日记、重要PDF)的功能。这个过程,不仅是对技术的实践,更是一次对个人数字足迹的整理与回顾——用代码,映照记录与传承的初心。
前置准备
在开始之前,请确保你的电脑已准备好以下环境与工具:
- Python环境:确保已安装Python 3.8或更高版本。你可以在Python官网下载安装包。
- 代码编辑器:推荐使用轻量且强大的 VS Code(https://marketplace.visualstudio.com/items?itemName=ms-python.python) 或PyCharm。
- 必要的Python库:我们将使用
os和shutil(系统自带,用于文件操作),以及datetime处理日期。为了更好的体验,建议安装rich库来美化终端输出。 - 素材准备:在一个文件夹中,随意放置一些你想要归档的文件,如
.jpg,.png,.pdf,.docx,.txt文件。这就是我们即将整理的“数字情书”原稿。
你可以使用以下命令安装 rich 库:
pip install rich
分步骤教程
第一步:规划记忆库的目录结构
良好的目录结构是清晰记忆的基石。我们计划创建一个名为 MyMemoryVault 的根目录,其下按照“年份-月份”和“文件类型”进行分类。
我们的目标结构如下:
MyMemoryVault/
├── 2024/
│ ├── 01/
│ │ ├── 图片/
│ │ ├── 文档/
│ │ └── 其他/
│ └── 02/
│ └── ...
├── 2023/
└── ...
第二步:编写核心分类函数
这个函数是我们的“记忆管理员”,它会判断一个文件属于哪个类别(图片、文档、或其他)。
import os
from pathlib import Path
def categorize_file(file_path):
"""根据文件扩展名返回其所属类别"""
suffix = Path(file_path).suffix.lower()
# 定义类别映射
image_exts = {'.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff'}
doc_exts = {'.pdf', '.docx', '.doc', '.xlsx', '.pptx', '.txt', '.md'}
if suffix in image_exts:
return "图片"
elif suffix in doc_exts:
return "文档"
else:
return "其他"
第三步:获取文件的修改日期
文件的创建或修改时间是它“诞生”或“重要”的时刻。我们用它来决定文件应该归入哪个月份。
from datetime import datetime
def get_file_modification_date(file_path):
"""获取文件的最后修改时间,并格式化为'年份/月份'路径"""
mod_time = os.path.getmtime(file_path)
# 将时间戳转换为 datetime 对象
mod_datetime = datetime.fromtimestamp(mod_time)
year_month = mod_datetime.strftime("%Y/%m") # 格式如 "2024/07"
return year_month, mod_datetime.strftime("%Y年%m月")
第四步:编写主归档逻辑
现在,我们将所有部分组合起来,创建主函数来扫描源文件夹并执行归档。
import shutil
from rich.console import Console
from rich.table import Table
console = Console()
def archive_memories(source_dir, target_root):
"""主归档函数"""
# 确保目标根目录存在
os.makedirs(target_root, exist_ok=True)
# 用于展示操作记录的表格
table = Table(title="记忆归档报告", show_lines=True)
table.add_column("源文件", style="cyan", no_wrap=True)
table.add_column("归档至", style="magenta")
table.add_column("状态", style="green")
console.print(f"🔍 正在扫描源文件夹: {source_dir}...\n")
# 遍历源目录中的所有文件
for root, dirs, files in os.walk(source_dir):
for file_name in files:
source_path = os.path.join(root, file_name)
# 1. 判断文件类别
category = categorize_file(source_path)
# 2. 获取文件日期
year_month_path, year_month_display = get_file_modification_date(source_path)
# 3. 构建完整的归档目标路径
# 目标路径:目标根/年份/月份/类别/原文件名
target_dir = os.path.join(target_root, year_month_path, category)
target_path = os.path.join(target_dir, file_name)
try:
# 创建目标目录(如果不存在)
os.makedirs(target_dir, exist_ok=True)
# 复制文件(使用 copy2 尽可能保留元数据)
shutil.copy2(source_path, target_path)
status = "✅ 成功"
except Exception as e:
status = f"❌ 失败: {str(e)}"
# 将结果添加到报告表格
table.add_row(
file_name,
f"{year_month_display}/{category}",
status
)
# 打印归档报告
console.print(table)
console.print(f"\n🎉 归档完成!记忆库已更新至: {target_root}")
# 运行主函数
if __name__ == "__main__":
# 设置源文件夹和目标记忆库路径(请修改为你的实际路径)
source_folder = "/path/to/your/mixed/files" # 存放杂乱文件的地方
memory_vault = "/path/to/your/MyMemoryVault" # 记忆库位置
archive_memories(source_folder, memory_vault)
第五步:运行与验证
- 将以上所有代码整合到一个Python文件中,例如
memory_archiver.py。 - 修改
__main__部分的source_folder和memory_vault变量,指向你的实际文件夹路径。 - 运行脚本:
bash
python memory_archiver.py
运行后,你会在终端看到一个清晰的表格报告,告诉你每个文件被归档到了哪里。去你的 MyMemoryVault 文件夹看看,一切应该已经井然有序!
代码示例(完整版)
以上代码片段的完整可运行版本已在此呈现。你可以直接复制并修改路径后使用。
# memory_archiver.py
import os
import shutil
from pathlib import Path
from datetime import datetime
from rich.console import Console
from rich.table import Table
console = Console()
def categorize_file(file_path):
"""根据文件扩展名返回其所属类别"""
suffix = Path(file_path).suffix.lower()
image_exts = {'.jpg', '.jpeg', '.png', '.gif', '.bmp', '.tiff'}
doc_exts = {'.pdf', '.docx', '.doc', '.xlsx', '.pptx', '.txt', '.md'}
if suffix in image_exts:
return "图片"
elif suffix in doc_exts:
return "文档"
else:
return "其他"
def get_file_modification_date(file_path):
"""获取文件的最后修改时间,并格式化为'年份/月份'路径"""
mod_time = os.path.getmtime(file_path)
mod_datetime = datetime.fromtimestamp(mod_time)
year_month = mod_datetime.strftime("%Y/%m")
return year_month, mod_datetime.strftime("%Y年%m月")
def archive_memories(source_dir, target_root):
"""主归档函数"""
os.makedirs(target_root, exist_ok=True)
table = Table(title="记忆归档报告", show_lines=True)
table.add_column("源文件", style="cyan", no_wrap=True)
table.add_column("归档至", style="magenta")
table.add_column("状态", style="green")
console.print(f"🔍 正在扫描源文件夹: {source_dir}...\n")
for root, dirs, files in os.walk(source_dir):
for file_name in files:
source_path = os.path.join(root, file_name)
category = categorize_file(source_path)
year_month_path, year_month_display = get_file_modification_date(source_path)
target_dir = os.path.join(target_root, year_month_path, category)
target_path = os.path.join(target_dir, file_name)
try:
os.makedirs(target_dir, exist_ok=True)
shutil.copy2(source_path, target_path)
status = "✅ 成功"
except Exception as e:
status = f"❌ 失败: {str(e)}"
table.add_row(
file_name,
f"{year_month_display}/{category}",
status
)
console.print(table)
console.print(f"\n🎉 归档完成!记忆库已更新至: {target_root}")
if __name__ == "__main__":
# 【重要】请修改以下两个路径为你自己的路径
source_folder = r"C:\Users\YourName\Downloads\MixedFiles" # Windows示例,Mac/Linux请用 /path/to/...
memory_vault = r"D:\MyMemoryVault"
archive_memories(source_folder, memory_vault)
相关工具与好物推荐
要更好地管理和享受你的数字记忆,除了代码,一些好工具和硬件也能极大提升体验。
- 创作与记录工具:如果你喜欢在 平板电脑 上手写日记或绘制灵感,iPad 配合 Apple Pencil 是绝佳的数字记忆创造工具。Android 平板和三星 S Pen 也是优秀的选择。
- 高精度输入设备:长时间编写和调试归档脚本,一把手感出色的 机械键盘 能有效缓解疲劳,提升编码的愉悦感。
- 高性能笔记本:处理大量文件归档和运行程序,你需要一台性能均衡的 笔记本电脑。兼顾便携性与性能的型号是首选。
- 数据备份方案:归档后的记忆库无比珍贵,务必遵守“3-2-1”备份原则(3份副本,2种介质,1份异地)。一块可靠的大容量 移动硬盘 用于本地备份是基础,再结合云存储服务进行异地备份。
- 学习资料:想深入学习Python文件处理和数据管理,一本经典的 《Python编程:从入门到实践》 能为你打下坚实的基础。
常见问题
Q1:运行脚本时提示“找不到模块 rich”怎么办?
A:这是因为尚未安装 rich 库。请在终端或命令提示符中运行 pip install rich 进行安装。
Q2:为什么归档后,原文件还在,没有被删除?
A:本教程出于数据安全考虑,使用的是 copy(复制)而非 move(移动)。这样原文件得以保留,相当于为你的记忆创建了副本。如果确认归档无误,你可以在脚本中将 shutil.copy2 改为 shutil.move 来实现移动。
Q3:我想自定义分类规则(例如,按项目或事件分类),该如何修改?
A:你可以在 categorize_file 函数中扩展规则。例如,你可以在文件名中包含 项目A 的,归类到 “项目A” 目录。只需添加字符串匹配逻辑即可,这需要你对Python字符串操作有基本了解。
Q4:如何定期自动运行这个归档脚本?
A:你可以使用操作系统自带的定时任务工具:
– Windows:使用“任务计划程序”。
– macOS/Linux:使用 crontab。
例如,在macOS/Linux下,每天晚上10点运行脚本,可以编辑crontab (crontab -e) 并添加一行:0 22 * * * /usr/bin/python3 /path/to/memory_archiver.py。
总结
通过这篇教程,我们共同完成了一件有意义的事:用现代编程语言Python,亲手打造了一个管理个人数字记忆的自动化工具。从规划目录结构,到编写分类逻辑,再到最终实现自动化归档,每一步都像在整理一封封珍贵的信件。
代码是冰冷的,但它所处理的数据——那些记录着欢笑、思考、学习与成长的文件——却承载着炽热的情感与回忆。这正是技术的魅力所在:它为我们承载与传承“纸短情长”的初心,提供了坚实的工具。
现在,你的数字记忆库已初具规模。你可以在此基础上继续扩展功能,比如添加按关键词搜索、生成年度回忆报告、自动备份到云端等。希望这个项目不仅能帮你整理好文件,更能激发你用技术去记录、珍视生活每一个瞬间的灵感。