2025年是自动化的时代。每个人都在讨论如何使用像n8n、Zapier、Huginn或Make这样的工具来自动化某些事情。但大家常常忽视了,使用老旧的Python其实也能轻松自动化几乎任何事情(真的)。我在Mac和Windows上运行一些小脚本,处理那些通常要花费我一周数小时的任务,真的是因为它们,我节省了不少时间。
清理收件箱的杂乱
当你不想处理所有这些杂乱时
这个小脚本通过IMAP连接到你的邮箱,帮你处理那些删除或归档不再需要的邮件的繁琐工作。你可以告诉它查找超过一定天数的未读邮件,它会悄悄地将它们移动到你的归档中,这样你的收件箱就会感觉轻松一些。
如果你每天收到成百上千封促销邮件,又不想一个个去清理,这个脚本就特别好用。由于它通过IMAP运行,因此在大多数电子邮件提供商中都能以相同的方式工作。
#!/usr/bin/env python3
clean_inbox.py
归档或删除超过N天的符合简单条件的邮件。
用法:
python clean_inbox.py your-email@example.com app-password --days 30 --archive
import imaplib, email, sys, argparse, datetime
parser = argparse.ArgumentParser()
parser.add_argument('email')
parser.add_argument('password')
parser.add_argument('--imap', default='imap.gmail.com')
parser.add_argument('--days', type=int, default=30)
parser.add_argument('--archive', action='store_true', help='移动到[Gmail]/所有邮件(Gmail)')
parser.add_argument('--delete', action='store_true', help='删除而不是归档')
args = parser.parse_args()
cutoff = (datetime.datetime.utcnow() - datetime.timedelta(days=args.days)).strftime("%d-%b-%Y")
M = imaplib.IMAP4_SSL(args.imap)
M.login(args.email, args.password)
M.select("INBOX")
typ, data = M.search(None, '(BEFORE "{}")'.format(cutoff))
ids = data[0].split()
print(f"找到 {len(ids)} 条在 {cutoff} 之前的邮件")
if not ids:
M.logout(); sys.exit()
if args.delete:
for i in ids: M.store(i, '+FLAGS', '\\Deleted')
M.expunge()
print("已删除邮件。")
elif args.archive:
# Gmail 特殊:通过复制然后从收件箱删除来移动到所有邮件
for i in ids:
M.copy(i, '[Gmail]/All Mail')
M.store(i, '+FLAGS', '\\Deleted')
M.expunge()
print("已归档邮件。")
else:
print("没有指定操作。请使用 --archive 或 --delete。")
M.logout()
备份文件到云存储
当你有分散的文件时节省时间
这个脚本给你提供了一个简单的方法,可以把文件上传到任何兼容S3的存储服务。当你有很多分散的文件想要从电脑上移走,或者需要快速备份工作文档、PDF或截图时,它能帮你节省时间。
这个脚本只专注于上传,保持了简洁,这让它非常适合每天或每周的备份。如果你喜欢 Wasabi 或 DigitalOcean Spaces 这样的服务,它也能正常使用,因为它采用了相同的 S3 操作方式。
#!/usr/bin/env python3
s3_backup.py
将本地文件夹同步到 S3 存储桶(上传新文件或已更改的文件)。
用法:
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...
python s3_backup.py /path/to/folder bucket-name prefix
import boto3, os, sys, hashlib
from pathlib import Path
local = Path(sys.argv[1])
bucket = sys.argv[2]
prefix = sys.argv[3] if len(sys.argv) > 3 else ''
s3 = boto3.client('s3')
def md5(path):
h=hashlib.md5()
with open(path,'rb') as f:
for chunk in iter(lambda: f.read(8192), b''): h.update(chunk)
return h.hexdigest()
for p in local.rglob('*'):
if p.is_file():
key = (prefix + '/' + str(p.relative_to(local))).lstrip('/')
# 快速检查:比较文件大小;如果大小相同且没有检查 etag,就跳过
s3.upload_file(str(p), bucket, key)
print("已上传", key)
排序截图
因为我们都有太多截图
截图往往分散在您的系统中,例如桌面和下载文件夹。该脚本找到它们,通过常见的命名模式识别它们,并将它们移动到一个按日期排序的单一整洁目标文件夹中。我再也不用到处找之前拍的截图了,因为所有的截图都整齐地放在一个干净的文件夹里。
您还可以使用干运行(dry run)模式,在允许任何更改之前显示将要移动的内容。它运行得很快,适合任何平台,是个能立刻让你的系统感觉不那么杂乱的小工具。如果你工作中拍了很多截图,这个脚本能帮你省下好几个小时的搜索和整理时间。
#!/usr/bin/env python3
screenshot_sorter.py
用法:
python screenshot_sorter.py --src ~/Downloads --src ~/Desktop --dest ~/Pictures/Screenshots --dry-run
import argparse, shutil, re
from pathlib import Path
from datetime import datetime
p = argparse.ArgumentParser()
p.add_argument('--src', action='append', default=[str(Path.home() / 'Downloads'), str(Path.home() / 'Desktop')])
p.add_argument('--dest', default=str(Path.home() / 'Pictures' / 'Screenshots'))
p.add_argument('--dry-run', action='store_true')
p.add_argument('--days', type=int, default=365)
args = p.parse_args()
patterns = re.compile(r'screen(sho?t)?t|screenshot|スクリーンショット|截圖', re.I)
exts = {'.png','.jpg','.jpeg','.webp','.bmp','.tiff'}
for s in args.src:
for f in Path(s).rglob('*'):
if f.is_file() and f.suffix.lower() in exts and patterns.search(f.name):
mtime = datetime.fromtimestamp(f.stat().st_mtime)
destdir = Path(args.dest) / mtime.strftime('%Y-%m-%d')
destdir.mkdir(parents=True, exist_ok=True)
target = destdir / f.name
if args.dry_run:
print("测试运行", f, "->", target)
else:
i = 1
while target.exists():
target = destdir / (f.stem + f"_{i}" + f.suffix)
i += 1
shutil.move(str(f), str(target))
print("移动", f, "->", target)
批量重命名文件
手动重命名文件非常麻烦
这个脚本提供了两种选择。你可以使用与原始名称部分相匹配的模式来重命名文件,或者你可以简单地使用简单的序列重命名所有文件。这是一个解决方案,适合用来清理照片文件夹、重新整理项目文件或修复不一致的文件名。因为它使用了正则表达式,你可以根据需要进行复杂的操作,也可以选择简单使用。
#!/usr/bin/env python3
bulk_rename.py
示例:
python bulk_rename.py /path/to/folder --pattern "IMG_(\d+)" --replace "photo_\\1" --ext .jpg
或者使用简单的序列:
python bulk_rename.py /path/to/folder --seq "photo" --ext .png
导入模块:
import argparse, re
from pathlib import Path
ap = argparse.ArgumentParser()
ap.add_argument('folder')
ap.add_argument('--pattern')
ap.add_argument('--replace')
ap.add_argument('--seq')
ap.add_argument('--ext', default='')
args = ap.parse_args()
folder = Path(args.folder)
如果提供了模式和替换参数:
rx = re.compile(args.pattern)
for f in folder.iterdir():
如果 f 是文件:
m = rx.search(f.name)
如果 m:
new = rx.sub(args.replace, f.name)
f.rename(folder / new)
print("重命名为", f.name, "->", new)
elif args.seq:
i = 1
对于 sorted(folder.iterdir()) 中的每个 f:
如果 f 是文件:
ext = args.ext or f.suffix
new = f"{args.seq}_{i}{ext}"
f.rename(folder / new)
print("重命名为", f.name, "->", new)
i += 1
else:
print("没有任何操作。请提供 --pattern/--replace 或 --seq 参数。")
整理文件和文件夹
给你的文件整理一下
这个脚本检查文件夹中的每个文件,并根据其扩展名将其移动到匹配的类别中。图片放入图片文件夹,文档放入文档文件夹,电子表格移动到电子表格文件夹,等等。任何不匹配的文件都会被放入其他文件夹。这个脚本非常适合用来清理杂乱的下载文件夹,或者为长期存储整理目录。只需一个小命令,就能帮你整理文件,不用手动拖来拖去。
#!/usr/bin/env python3
arrange_it.py
使用方法:
python arrange_it.py /path/to/folder
import sys
from pathlib import Path
mapping = {
'Images': {'.png','.jpg','.jpeg','.gif','.webp','.bmp','.tiff'},
'Docs': {'.pdf','.docx','.doc','.txt','.md','.odt','.rtf'},
'Spreadsheets': {'.xls','.xlsx','.csv'},
'Archives': {'.zip','.tar','.gz','.rar','.7z'},
'Scripts': {'.py','.sh','.js','.ps1'},
'Videos': {'.mp4','.mkv','.mov','.webm','.avi'}
root = Path(sys.argv[1] if len(sys.argv)>1 else '.').expanduser()
for f in root.iterdir():
如果 f 是文件:
moved=False
对于 folder, exts 在 mapping.items():
如果 f.suffix.lower() in exts:
dest = root / folder
dest.mkdir(exist_ok=True) # 创建目标文件夹,如果已存在则不报错
目标路径 = 目标路径 / f.name
i=1
当目标文件存在时:
目标路径 = 目标路径 / (f.stem + f"_"+str(i) + f.suffix)
i += 1
f.replace(目标路径)
print("移动了", f.name, "->", 目标路径.name + '/' + f.name)
已移动 = True
break
如果没有移动任何文件:
目标文件夹 = 根 / '其他'
目标文件夹.mkdir(exist_ok=True)
f.replace(目标文件夹 / f.name)
print("移动了", f.name, "-> 其他/" + f.name)
把剪贴板内容保存为文本文件
一切都以纯文本格式保存
如果你在一天中复制了很多文本,你可能会失去对重要片段的追踪。这个脚本会监控你的剪贴板,把每个新复制的内容保存到每日的文本文件中。它让你可以回去找到你之前复制的任何内容,无论是笔记、链接还是一段代码。这个想法是为你提供一个简单的个人剪贴板历史记录,而不需要使用复杂的剪贴板管理器。一切都以纯文本保存在一个你可以同步或归档的文件夹中。对于作家、开发者和研究人员来说,它成为一个安静的助手,帮助你恢复那些你通常会丢失的东西。
#!/usr/bin/env python3
clip_save.py
在终端中运行,或作为后台进程执行。它会把新的剪贴板内容追加到每日的文件中。
用法:
python clip_save.py
import time, os
from datetime import datetime
import pyperclip
输出 = os.path.expanduser('~/clipboard_history')
os.makedirs(输出, exist_ok=True)
最后 = None
while True:
尝试:
txt = pyperclip.paste()
except Exception:
txt = ''
如果 txt 并且 txt != 最后:
最后 = txt
fn = os.path.join(输出, datetime.now().strftime('%Y-%m-%d') + '.txt')
with open(fn, 'a', encoding='utf-8') as f:
f.write(f"\n\n[{datetime.now().isoformat()}]\n{txt}\n")
print("保存到", fn)
time.sleep(1.5)
Python 易于学习
学习 Python 非常简单,只要你掌握了基础, 它可以成为你作为 PC 用户的真正改变者。你可以用它来自动化工作流程中的某些部分,或者将其插入到你已经使用的应用程序中,使它们更强大。例如,你甚至可以 通过引入 Python 来提升你在 Excel 中的生产力。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.