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,
num_level2=2,
num_level3=2,
)
print("\n文件/文件夹结构创建完成!")