Published on

python生成随机文件

Authors
  • avatar
    Name
    刘十三
    Twitter
import random
import urllib.request
from pathlib import Path

LEVEL1_NAMES = [
    "documents", "media", "projects", "archives", "backup",
    "downloads", "templates", "resources", "configs", "logs",
]
LEVEL2_NAMES = [
    "images", "videos", "audio", "text", "code", "data",
    "reports", "exports", "imports", "temp",
]
LEVEL3_NAMES = [
    "sample", "demo", "test", "main", "utils", "settings",
    "output", "input", "summary", "details",
]
FILE_EXTENSIONS = [".txt", ".md", ".py", ".csv", ".json", ".log"]
IMAGE_EXTENSIONS = [".jpg"]
ROOT_FILE_NAMES = ["README.txt", "config.json", "index.md"]

CONTENT_BY_EXT = {
    ".txt": "Content for {name}\nLine 2\nLine 3",
    ".md": "# {name}\n\nParagraph one.\n\nParagraph two.",
    ".py": '"""{name}"""\n\ndef main():\n    pass\n',
    ".csv": "id,name,value\n1,a,10\n2,b,20",
    ".json": '{{"name": "{name}", "version": 1}}',
    ".log": "[2024-01-01] {name} started\n[2024-01-01] {name} done",
}


def _download_picsum(path: Path, ext: str):
    path.parent.mkdir(parents=True, exist_ok=True)
    w, h = random.randint(200, 400), random.randint(150, 300)
    url = f"https://picsum.photos/{w}/{h}.jpg"
    req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"})
    with urllib.request.urlopen(req, timeout=15) as r:
        path.write_bytes(r.read())


def _write_file(path: Path, ext: str, name: str):
    path.parent.mkdir(parents=True, exist_ok=True)
    if ext in IMAGE_EXTENSIONS:
        _download_picsum(path, ext)
        return
    tmpl = CONTENT_BY_EXT.get(ext, CONTENT_BY_EXT[".txt"])
    path.write_text(tmpl.format(name=name or path.stem), encoding="utf-8")


def _add_files_in_dir(dir_path: Path, count: int, prefix: str = ""):
    exts = FILE_EXTENSIONS + IMAGE_EXTENSIONS
    names = random.sample(LEVEL3_NAMES, min(count, len(LEVEL3_NAMES)))
    for i, name in enumerate(names):
        ext = random.choice(exts)
        fpath = dir_path / f"{prefix}{name}_{i}{ext}" if prefix else dir_path / f"{name}{ext}"
        _write_file(fpath, ext, name)
        print(f"    创建文件: {fpath}")


def create_directory_structure(base_path, num_level1=3, num_level2=2, num_level3=2):
    base_path = Path(base_path)
    base_path.mkdir(exist_ok=True)

    for fname in ROOT_FILE_NAMES:
        p = base_path / fname
        ext = p.suffix
        _write_file(p, ext, base_path.name)
        print(f"创建根目录文件: {p}")
    _write_file(base_path / "cover.jpg", ".jpg", "cover")
    print("创建根目录文件: " + str(base_path / "cover.jpg"))

    selected_level1 = random.sample(LEVEL1_NAMES, min(num_level1, len(LEVEL1_NAMES)))
    for level1_name in selected_level1:
        level1_path = base_path / level1_name
        level1_path.mkdir(exist_ok=True)
        print(f"创建第一层文件夹: {level1_path}")
        _add_files_in_dir(level1_path, 2, "l1_")

        selected_level2 = random.sample(LEVEL2_NAMES, min(num_level2, len(LEVEL2_NAMES)))
        for level2_name in selected_level2:
            level2_path = level1_path / level2_name
            level2_path.mkdir(exist_ok=True)
            print(f"  创建第二层文件夹: {level2_path}")
            _add_files_in_dir(level2_path, 2, "l2_")

            selected_level3 = random.sample(LEVEL3_NAMES, min(num_level3, len(LEVEL3_NAMES)))
            for idx, level3_name in enumerate(selected_level3):
                if idx % 2 == 0:
                    level3_path = level2_path / level3_name
                    level3_path.mkdir(exist_ok=True)
                    print(f"    创建第三层文件夹: {level3_path}")
                    _add_files_in_dir(level3_path, 1, "l3_")
                else:
                    ext = random.choice(FILE_EXTENSIONS + IMAGE_EXTENSIONS)
                    level3_path = level2_path / f"{level3_name}{ext}"
                    _write_file(level3_path, ext, level3_name)
                    print(f"    创建第三层文件: {level3_path}")


if __name__ == "__main__":
    # 获取脚本所在目录作为根目录
    script_dir = Path(__file__).parent.absolute()
    print(f"开始创建文件/文件夹结构,根目录:{script_dir}\n")

    # 调用函数创建结构(可调整数量参数)
    create_directory_structure(
        base_path=script_dir,
        num_level1=3,  # 第一层创建3个文件夹
        num_level2=2,  # 每个第一层文件夹下创建2个第二层文件夹
        num_level3=2,  # 每个第二层文件夹下创建2个第三层(1个文件夹+1个文件)
    )

    print("\n文件/文件夹结构创建完成!")