| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- # -*- 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()
|