3个Python脚本:每天帮你省出半小时
数据生成手写JSON、日志分析靠肉眼搜索、文件批量改名一个个右键重命名——这三个场景,用脚本几秒搞定
三个脚本各解决一个高频重复场景。每个都可以独立运行,复制代码就能用。
脚本一:批量生成测试数据
场景:测试接口时需要上百条用户数据,手工写JSON写到手酸。这个脚本生成任意数量的中文用户数据,输出为JSON文件。
import jsonimport randomfrom datetime import datetime, timedeltadefgenerate_users(count=100):"""生成指定数量的测试用户数据""" surnames = ["张", "李", "王", "赵", "陈", "杨", "黄", "周", "吴", "徐"] names = ["明", "华", "强", "丽", "芳", "伟", "静", "涛", "磊", "敏"] users = []for i inrange(1, count + 1): name = random.choice(surnames) + random.choice(names) users.append({"id": i,"username": f"testuser{i:04d}","realname": name,"email": f"testuser{i:04d}@example.com","phone": f"138{random.randint(10000000, 99999999)}","age": random.randint(18, 65),"city": random.choice(["北京", "上海", "广州", "深圳", "杭州", "成都", "武汉"]),"status": random.choice(["active", "active", "active", "inactive"]),"created_at": (datetime.now() - timedelta(days=random.randint(0, 365))).strftime("%Y-%m-%d %H:%M:%S") })return usersif __name__ == "__main__": data = generate_users(100)withopen("test_users.json", "w", encoding="utf-8") as f: json.dump(data, f, ensure_ascii=False, indent=2)print(f"已生成 {len(data)} 条用户数据 → test_users.json")# 同时也生成一份CSV方便Excel打开import csvwithopen("test_users.csv", "w", encoding="utf-8-sig", newline="") as f: writer = csv.DictWriter(f, fieldnames=data[0].keys()) writer.writeheader() writer.writerows(data)print(f"已生成 {len(data)} 条用户数据 → test_users.csv")
说明:生成的数据中status字段故意用了加权随机(active概率75%),让数据更接近真实分布,适合测列表筛选功能。
脚本二:日志快速搜索与统计
场景:应用日志文件几百MB,用文本编辑器打开直接卡死。这个脚本支持关键词搜索、按时间段过滤、统计ERROR数量。
import sysfrom collections import Counterdefsearch_log(filepath, keyword=None, limit=50):"""搜索日志文件中包含关键词的行""" matches = []withopen(filepath, "r", encoding="utf-8", errors="ignore") as f:for line_num, line inenumerate(f, 1):if keyword isNoneor keyword.lower() in line.lower(): matches.append((line_num, line.strip()))iflen(matches) >= limit:breakreturn matchesdefcount_errors(filepath):"""统计日志中各类型错误的数量""" counter = Counter()withopen(filepath, "r", encoding="utf-8", errors="ignore") as f:for line in f:if"ERROR"in line.upper(): counter["ERROR"] += 1elif"WARN"in line.upper(): counter["WARN"] += 1elif"FATAL"in line.upper(): counter["FATAL"] += 1return counterdeffilter_by_time(filepath, start_hour, end_hour):"""按时间段过滤日志""" results = []withopen(filepath, "r", encoding="utf-8", errors="ignore") as f:for line in f: parts = line.split()iflen(parts) >= 2: time_str = parts[1] iflen(parts) >= 2else""if time_str andlen(time_str) >= 5:try: hour = int(time_str.split(":")[0])if start_hour <= hour <= end_hour: results.append(line.strip())except ValueError:continuereturn resultsif __name__ == "__main__":iflen(sys.argv) < 2:print("用法: python log_search.py <日志文件路径> [关键词]") sys.exit(1) filepath = sys.argv[1] keyword = sys.argv[2] iflen(sys.argv) > 2elseNone# 1. 搜索关键词if keyword:print(f"\n=== 搜索关键词: {keyword} ===") matches = search_log(filepath, keyword)for line_num, line in matches:print(f" L{line_num}: {line[:120]}")# 2. 统计错误print(f"\n=== 错误统计 ===") errors = count_errors(filepath)for level, count in errors.items():print(f" {level}: {count} 条")# 3. 查看最近50行print(f"\n=== 最近50行 ===") recent = search_log(filepath, limit=50)for line_num, line in recent:print(f" L{line_num}: {line[:120]}")
说明:search_log函数默认只返回前50条匹配结果,避免输出过多。改limit参数可以调整返回数量。
脚本三:文件批量重命名
场景:从同事那收到一堆截图或日志,文件名是image(1).png、image(2).png这种。这个脚本按规则批量重命名。
import osimport sysfrom pathlib import Pathdefbatch_rename(directory, pattern="file_{:03d}{ext}"):"""批量重命名文件"""ifnot os.path.exists(directory):print(f"目录不存在: {directory}")return files = sorted([f for f in os.listdir(directory) if os.path.isfile(os.path.join(directory, f))])ifnot files:print("目录下没有文件")returnprint(f"找到 {len(files)} 个文件,预览重命名结果:")for i, filename inenumerate(files, 1): ext = Path(filename).suffix new_name = pattern.format(i, ext=ext)print(f" {filename:30s} → {new_name}") confirm = input("\n确认重命名? (y/n): ")if confirm.lower() != "y":print("已取消")returnfor i, filename inenumerate(files, 1): ext = Path(filename).suffix new_name = pattern.format(i, ext=ext) old_path = os.path.join(directory, filename) new_path = os.path.join(directory, new_name) os.rename(old_path, new_path)print(f"完成,{len(files)} 个文件已重命名")if __name__ == "__main__":iflen(sys.argv) < 2:print("用法: python rename.py <目录路径>") sys.exit(1) batch_rename(sys.argv[1])
说明:脚本会先预览所有变更,确认后才执行。不改动确认不会误操作。
三个脚本覆盖了测试日常中数据准备、日志排查、文件整理三个高频场景。都不是复杂工具,但就是这些重复小事每天在消耗你的时间。