# -*- coding: utf-8 -*- # Author : Charley # Python : 3.12.10 # Date : 2026/08/04 """从 球队.json 解析 teams 数据(中文名/英文名/价格/数量)并导出到 Excel。 球队.json 实为 .py 风格文本:真正的 JSON 存放在 `json = \"\"\"...\"\"\"` 三引号块里, teams 位于 data.remainingRandomTeamSnapshot.teams。字段对应: 中文名 teamNameZh / 英文名 teamNameEn / 价格 unitPrice / 数量 availableStock """ import re import json import sys from openpyxl import Workbook from openpyxl.styles import Font, Alignment SRC_FILE = "球队.json" # 源文件(含三引号 JSON 块) OUT_FILE = "球队.xlsx" # 导出的 Excel HEADERS = ["中文名", "英文名", "价格", "数量"] # 列顺序 def extract_teams(src: str) -> list[dict]: """从源文件中抽取三引号 JSON 并取出 teams 列表。 Args: src (str): 源文件路径。 Returns: list[dict]: teams 原始字典列表;未找到返回空列表。 Raises: ValueError: 源文件里找不到三引号包裹的 JSON 块时抛出。 """ txt = open(src, encoding="utf-8").read() m = re.search(r'"""(.*?)"""', txt, re.S) # 抓取三引号内的 JSON 文本 if not m: raise ValueError(f"{src} 中未找到三引号包裹的 JSON 块") data = json.loads(m.group(1).strip()) # teams 固定在 data.remainingRandomTeamSnapshot.teams snapshot = (data.get("data") or {}).get("remainingRandomTeamSnapshot") or {} return snapshot.get("teams") or [] def export_excel(teams: list[dict], out: str): """把 teams 的四个字段写入 Excel(带表头、加粗、列宽自适应)。 Args: teams (list[dict]): extract_teams 返回的球队字典列表。 out (str): 导出的 xlsx 文件路径。 """ wb = Workbook() ws = wb.active ws.title = "球队" # 表头:加粗 + 居中 ws.append(HEADERS) for cell in ws[1]: cell.font = Font(bold=True) cell.alignment = Alignment(horizontal="center") # 数据行:价格转 float 便于 Excel 计算,数量转 int for t in teams: ws.append([ t.get("teamNameZh"), t.get("teamNameEn"), float(t["unitPrice"]) if t.get("unitPrice") is not None else None, t.get("availableStock"), ]) # 简单列宽自适应(按各列最长字符估算,中文按 2 宽计) for col_idx, header in enumerate(HEADERS, 1): max_len = max( [len(str(header).encode("gbk", "ignore"))] + [len(str(ws.cell(row=r, column=col_idx).value or "").encode("gbk", "ignore")) for r in range(2, ws.max_row + 1)] ) ws.column_dimensions[chr(64 + col_idx)].width = max_len + 2 wb.save(out) def main(): """解析 球队.json 并导出 球队.xlsx,打印导出条数。""" teams = extract_teams(SRC_FILE) if not teams: print("未解析到 teams 数据,退出") sys.exit(1) export_excel(teams, OUT_FILE) print(f"已导出 {len(teams)} 条球队数据 -> {OUT_FILE}") if __name__ == "__main__": main()