真正消耗人的往往不是大任务,而是那些「明明几分钟能搞定、但每次都要现找工具」的零碎活。这一篇收的六个脚本,正好填这些缝:视频太大要压、动图要截、发图前想抹掉定位、想定时提醒、顺手看看哪个端口开着、新建项目想一键把目录搭好。每一个都不复杂,但凑齐了能省下不少来回切换的工夫。
1. 视频压缩瘦身
手机拍的视频动辄几百兆,发人发平台都嫌大。用 moviepy 按码率重压一遍,体积能小一大圈,画质损失在可接受范围。
(需 pip install moviepy,并安装 ffmpeg)
from moviepy.editor import VideoFileClip
defcompress(inp, out, bitrate="1000k"):
clip = VideoFileClip(inp)
clip.write_videofile(out, bitrate=bitrate,
codec="libx264", audio_codec="aac")
clip.close()
# compress("raw.mp4", "small.mp4", bitrate="800k")
小提示:bitrate 越小文件越小、画质越糊,800k~1500k 是常用区间;竖屏长视频还可以先 clip.resize(height=720) 再压,体积会再降一截。
2. 视频转 GIF 动图
要把一段操作演示做成动图发出去,不用开剪辑软件,截取其中几秒转成 GIF 即可。
(需 pip install moviepy + ffmpeg)
from moviepy.editor import VideoFileClip
defto_gif(inp, out="out.gif", start=0, end=5, width=480):
clip = VideoFileClip(inp).subclip(start, end).resize(width=width)
clip.write_gif(out, fps=12)
clip.close()
# to_gif("demo.mp4", start=2, end=6)
小提示:GIF 体积对时长和尺寸很敏感,建议控制在 3~6 秒、宽度 480 以内;fps 降到 10 左右肉眼差别不大,文件却能小不少。
3. 发图前清除定位等隐私信息
照片里藏着拍摄时间、设备、 GPS 定位这类元数据,直接发出去等于把行踪也带出去了。重新编码一遍就能把这些元数据抹掉。
(需 pip install pillow)
from PIL import Image
import os
defclear_meta(src, dst):
im = Image.open(src).convert("RGB")
im.save(dst) # 重新编码,不写入任何元数据
os.makedirs("clean", exist_ok=True)
for n in os.listdir("photos"):
if n.lower().endswith((".jpg", ".png")):
clear_meta(f"photos/{n}", f"clean/{n}")
小提示:重新保存会丢元数据、也有极轻微画质损失,换来的是定位和设备信息彻底清除;对外发图、尤其是含位置的照片,先过这一道更稳妥。
4. 终端倒计时提醒
煮个面、做个二十五分钟专注,想有个不看手机也能盯着的提醒,终端里跑个倒计时就行,零依赖。
(标准库,无需安装)
import time, sys
defcountdown(seconds):
while seconds:
m, s = divmod(seconds, 60)
sys.stdout.write(f"\r 剩余 {m:02d}:{s:02d}")
sys.stdout.flush()
time.sleep(1)
seconds -= 1
print("\r 时间到!")
# countdown(1500) # 25 分钟
小提示:\r 是把光标移回行首,配合 flush 就能在同一行刷新,形成跳动的数字;想更醒目可以在结束时加一声响铃或弹窗。
5. 端口连通性自查
本地起了服务,想知道某个端口到底开没开、是不是被占了,用 socket 探一下最快,零依赖。
(标准库,无需安装)
import socket
defscan(host, ports=(80, 443, 8080)):
for p in ports:
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(0.5)
ok = sock.connect_ex((host, p)) == 0
print(f"{host}:{p}{'开放'if ok else'关闭'}")
sock.close()
# scan("127.0.0.1")
小提示:只对自己有权限的主机做这类检查;settimeout 设小一点避免卡住,端口范围一大就会比较慢,按需缩小列表即可。
6. 一键生成项目目录骨架
每开一个新项目都要手动建一堆文件夹,写一次骨架模板,以后新建项目一条命令搞定。
(标准库,无需安装)
import os
defscaffold(base, struct):
for path in struct:
os.makedirs(os.path.join(base, path), exist_ok=True)
print("目录骨架已生成:", base)
skeleton = [
"src", "src/utils", "tests",
"docs", "data/raw", "data/out",
]
scaffold("my_project", skeleton)
小提示:exist_ok=True 保证重复运行不报错;把 skeleton 换成你自己的常用结构(比如加上 assets、logs),新建任何工程都能直接复用。
这六个脚本覆盖的是「多媒体处理、隐私、提醒、网络自查、工程初始化」几类零碎需求。它们单个都不起眼,但放在一起,刚好把日常里那些「下次再说」的小事,变成了敲一下就完的事。