为什么写 CLI
这学期课设需要一个工具来整理下载文件夹——每次截图、PDF、压缩包全混在一起,找文件靠搜索。Python 标准库 argparse 就能写出像样的命令行工具,不需要第三方依赖。
argparse 核心三要素
import argparse
import os
import shutil
from pathlib import Path
def create_parser():
parser = argparse.ArgumentParser(
description="按文件类型整理目录",
epilog="示例:python organize.py -p ~/Downloads -t"
)
parser.add_argument("-p", "--path", default=".",
help="要整理的目录路径(默认当前目录)")
parser.add_argument("-t", "--test", action="store_true",
help="仅预览,不实际移动文件")
parser.add_argument("-o", "--output", default="organized",
help="分类后的输出目录名(默认 organized)")
parser.add_argument("--dry-run", action="store_true",
help="等同于 -t,仅预览")
return parser
关键概念:
- positional argument:不带
-前缀,必须按顺序传 - optional argument:带
-或--,可选 - action="store_true":传了就为 True,不传为 False,适合开关选项
完整实现
# organize.py — 文件整理工具
FILE_CATEGORIES = {
"图片": [".jpg", ".jpeg", ".png", ".gif", ".svg", ".webp"],
"文档": [".pdf", ".docx", ".doc", ".xlsx", ".pptx", ".txt"],
"压缩包": [".zip", ".rar", ".7z", ".tar", ".gz"],
"代码": [".py", ".js", ".html", ".css", ".json", ".yaml"],
"安装包": [".exe", ".msi", ".deb", ".rpm", ".dmg"],
}
def organize_directory(path: str, output: str, dry_run: bool):
target = Path(path).expanduser().resolve()
if not target.exists():
print(f"错误:目录不存在 - {target}")
return
output_dir = target / output
for item in target.iterdir():
if item.is_dir():
continue # 跳过子目录
suffix = item.suffix.lower()
category = "其他"
for cat, exts in FILE_CATEGORIES.items():
if suffix in exts:
category = cat
break
dest = output_dir / category
if not dry_run:
dest.mkdir(parents=True, exist_ok=True)
shutil.move(str(item), str(dest / item.name))
print(f"移动: {item.name} → {category}/")
else:
print(f"[预览] {item.name} → {category}/")
def main():
parser = create_parser()
args = parser.parse_args()
if args.dry_run:
args.test = True
organize_directory(args.path, args.output, args.test)
if __name__ == "__main__":
main()
使用效果
# 测试运行(不实际移动) python organize.py -p ~/Downloads -t # 实际整理 python organize.py -p ~/Downloads # 指定输出目录 python organize.py -p ~/Downloads -o 分类文件 # 查看帮助 python organize.py -h
argparse 进阶技巧
# 子命令(类似 git commit / git push)
subparsers = parser.add_subparsers(dest="command")
# 子命令:初始化
init_parser = subparsers.add_parser("init", help="初始化配置")
# 子命令:清理
clean_parser = subparsers.add_parser("clean", help="清理空目录")
# 类型自动转换
parser.add_argument("--size", type=int, default=1024,
help="文件大小阈值(字节)")
# 可选值限制
parser.add_argument("--mode", choices=["copy", "move", "link"],
default="move", help="处理方式")
总结
argparse 是 Python 标准库的宝藏模块——零依赖就能写出专业的命令行工具。核心记住三步:定义参数 → 解析参数 → 用参数执行。掌握了这个,写个小工具解决日常问题就很容易了。