为什么写 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 标准库的宝藏模块——零依赖就能写出专业的命令行工具。核心记住三步:定义参数 → 解析参数 → 用参数执行。掌握了这个,写个小工具解决日常问题就很容易了。