很多人把 Python 当成写算法题、做数据的工具,其实它最实用的场景,是替你处理那些零碎、重复、做了又忘的琐事。下面这 6 个脚本,每一个都瞄准一个具体问题:有的把图片变成字符画,有的把一堆图合成动图,有的帮你揪出硬盘里最占空间的文件。代码都不长,依赖也都是常见库,复制回去稍作修改就能直接运行。
1. 把任意图片变成字符画
发朋友圈总用千篇一律的滤镜,不如用代码把照片转成由字符组成的画。原理很简单:先把图片压成灰度小图,再把每个像素的亮度映射成一个字符,越暗用越密的字符。纯本地运行,不依赖任何外部服务。
(需 pip install pillow)
from PIL import Image
ASCII_CHARS = "@%#*+=-:. "# 从深到浅排列
defimg_to_ascii(path, width=100):
img = Image.open(path).convert("L") # 转灰度
w, h = img.size
new_h = int(h * width / w / 2) # /2 补偿字符高宽比
img = img.resize((width, new_h))
pixels = img.getdata()
lines = []
for i, p in enumerate(pixels):
ch = ASCII_CHARS[p * (len(ASCII_CHARS) - 1) // 255]
lines.append(ch)
if (i + 1) % width == 0:
lines.append("\n")
return"".join(lines)
art = img_to_ascii("photo.jpg", width=100)
print(art)
with open("ascii_art.txt", "w", encoding="utf-8") as f:
f.write(art)
小提示:width 越大字符画越精细,ASCII_CHARS 可以换成你喜欢的字符集。在等宽字体下观看效果最好,直接复制进终端或记事本就能展示。
2. 多张图片合成一个 GIF 动图
做教程、记录步骤、做个小表情包,经常需要把一系列静态图拼成动图。用 Pillow 几行就能搞定,还能统一尺寸、控制每帧时长。
(需 pip install pillow)
import os
from PIL import Image
defmake_gif(folder, output="out.gif", duration=500, size=(600, 600)):
files = sorted(
f for f in os.listdir(folder)
if f.lower().endswith((".png", ".jpg", ".jpeg"))
)
frames = [
Image.open(os.path.join(folder, f)).convert("RGB").resize(size)
for f in files
]
frames[0].save(
output,
save_all=True,
append_images=frames[1:],
duration=duration, # 每帧毫秒
loop=0, # 0 表示无限循环
)
print(f"已生成 {output},共 {len(frames)} 帧")
make_gif("frames", output="demo.gif", duration=400)
小提示:duration 越小动图越快;size 建议统一,否则生成的 GIF 会错位。图片命名按数字顺序排好,合成后帧序才正确。
3. 文件夹空间侦探:揪出最占硬盘的文件
电脑越用越卡,往往是某几个大文件在悄悄吃空间。这个脚本扫描指定目录,按体积从大到小排出前 N 个文件,一眼看清是谁在占地方。零依赖,标准库即可。
import os
defhuman(size):
for unit in ["B", "KB", "MB", "GB"]:
if size < 1024:
returnf"{size:.2f}{unit}"
size /= 1024
returnf"{size:.2f} TB"
defspace_detective(folder, top=10):
data = []
for root, _, files in os.walk(folder):
for name in files:
p = os.path.join(root, name)
try:
data.append((os.path.getsize(p), p))
except OSError:
pass
data.sort(reverse=True)
for size, p in data[:top]:
print(f"{human(size):>12}{p}")
space_detective("D:/Downloads", top=10)
小提示:把路径换成你最常塞东西的目录(如下载、桌面、文档目录);top 控制显示前几名。扫描整块磁盘可能较慢,建议先针对单个文件夹使用。
4. 批量提取 PDF 里的文字
收藏了一堆 PDF 资料,想检索里面的内容却搜不到?把文字提取出来存成 txt,就能用任意编辑器全文搜索。单个文件和整个文件夹批量处理都支持。
(需 pip install pypdf)
import os
from pypdf import PdfReader
defpdf_to_text(pdf_path, out_dir="txt_out"):
os.makedirs(out_dir, exist_ok=True)
reader = PdfReader(pdf_path)
text = "\n".join(page.extract_text() or""for page in reader.pages)
out = os.path.join(out_dir, os.path.splitext(os.path.basename(pdf_path))[0] + ".txt")
with open(out, "w", encoding="utf-8") as f:
f.write(text)
print(f"已提取 {len(reader.pages)} 页 -> {out}")
defbatch_pdf(folder):
for f in os.listdir(folder):
if f.lower().endswith(".pdf"):
pdf_to_text(os.path.join(folder, f))
batch_pdf("pdfs")
小提示:扫描件(图片型 PDF)提取不出文字,需要先做 OCR;out_dir 默认建在原 PDF 同级的 txt_out 文件夹,方便对照。
5. CSV 一键转成 Excel 表格
导出的报表常常是 CSV,用记事本打开一团乱,发给同事也不够正式。一段代码把 CSV 转成规整的 Excel,还能顺手处理中文乱码问题(utf-8-sig 是关键)。
(需 pip install openpyxl)
import csv
from openpyxl import Workbook
defcsv_to_xlsx(csv_path, xlsx_path=None):
xlsx_path = xlsx_path or csv_path[:-4] + ".xlsx"
wb = Workbook()
ws = wb.active
with open(csv_path, newline="", encoding="utf-8-sig") as f:
for row in csv.reader(f):
ws.append(row)
wb.save(xlsx_path)
print(f"已转换 -> {xlsx_path}")
csv_to_xlsx("data.csv")
小提示:utf-8-sig 编码能保证 Excel 正确识别中文,别写成纯 utf-8;表头会作为第一行原样写入。想给多张 CSV 批量转,套一层文件夹遍历即可。
6. 终端跑马灯:用代码做文字动画
命令行工具也能有仪式感。这段脚本让一行文字在终端里来回滚动,像老式电子屏的跑马灯,用来做提醒、做演示都挺有意思。纯标准库,不需要安装任何东西。
import sys
import time
defmarquee(text, width=40, rounds=3, speed=0.12):
pad = " " * width
line = pad + text + pad
for _ in range(rounds):
for i in range(len(line) - width + 1):
sys.stdout.write("\r" + line[i:i + width])
sys.stdout.flush()
time.sleep(speed)
print()
marquee(" 喝水 · 伸懒腰 · 眨眨眼 · 起来走两步 ")
小提示:width 是显示窗口宽度,speed 越小滚得越慢,rounds 控制循环次数。文字里可以换成你的待办或提醒,放在脚本开头当欢迎语也合适。
这 6 个脚本覆盖了图像创意、文件管理、文档提取、表格转换和命令行交互几个常见场景。它们共同的优点是「短」和「稳」——不用配置环境、不连外部服务、不涉及账号授权,改改路径就能用。挑一个最贴近你日常工作的先跑起来,把它存成 .py 文件,它就是属于你自己的效率工具。