🐸

混合账本

数据与文本工具python-data-tinkerer-34-the-mixed-ledger
奖励: 180 XP
|

混合账本

Hoppy 走进档案馆试炼的第一道门,看见桌上摊着两样东西:一卷写得有点乱的账本碎页,以及一份保存得很整齐的货架索引。单看任何一份材料都不算难,但如果它们要一起工作,就不能只会做单点小动作了。

这正是 Chapter 6 的开场感觉:不是再学一个新按钮,而是把你前面学过的字符串、文本、记录和小结构能力,真正放到同一条任务线上。

综合任务,往往是“先清文本,再补记录”

真实一点的小数据任务,很少只靠一种材料完成。你可能先从一行脏文本里拆出关键字段,再去结构化记录里补上更多信息,最后把结果收成一份更清楚的输出。

sample_line = "  ## token=glow~dust | shelf=s1 | status=ready??  "
sample_index = {
  "s1": {"keeper_name": "Pip", "room_name": "Moss Hall"}
}

cleaned_line = sample_line.strip().replace("## ", "").replace("~", " ").replace("??", "")
parts = cleaned_line.split(" | ")
token_name = parts[0].split("=")[1]
shelf_code = parts[1].split("=")[1]
keeper_name = sample_index[shelf_code]["keeper_name"]

preview = {
  "token_name": token_name,
  "keeper_name": keeper_name
}

print(preview)

这个例子只是演示“清一行文本,再用一份记录补信息”的动作链,不是今天 starter 的完整答案。真正任务里,你会把三条账本行都整理出来,再收成一份更有组织的档案结果。

今天的任务:把混合账本整理成档案结果

starter 已经帮你读好了 mixed_ledger.txtshelf_index.json。你要补完两步小工具,再把它们串起来:先完成 clean_line(raw_line),再完成 build_entry(cleaned_line),最后做出 cleaned_linesorganized_entriesready_entriesledger_summary

1
先把每一行账本文本清回可读形状

三条账本行都带着同一种噪声:前缀 "## "、挤在一起的 "~"、以及尾部的 "??"。先在 clean_line(raw_line) 里把这一套清理动作写好。

2
再把清理后的文本行拆成字段

build_entry(cleaned_line) 里,先用 split(" | ") 拆成三段,再用 split("=") 读出 item_nameshelf_codestatus

3
用 JSON 索引补上结构化信息

仅靠文本行,你只知道物品、货架代码和状态。再用 shelf_index[shelf_code]keeper_nameroom_name 补进来,让结果变成一条更完整的记录。

4
把三条记录收成有组织的输出

用三条清理后的行做出 organized_entries 列表,再筛出 ready_entries,最后整理 ledger_summary。这就是这节课真正想让你感受到的:文本、记录和结果组织已经开始一起工作了。

这是 Mastery Arc 的第一关

这节课不引入新概念,也不把你丢进大型项目。我们只把你前面学过的动作拉到同一个小任务里,让你明显感觉到:我已经不只是在做零散练习,而是在用整门 Series 的能力做事。

参考答案
点击展开
参考答案:
import json

with open("mixed_ledger.txt", "r", encoding="utf-8") as file:
  ledger_text = file.read().strip()

with open("shelf_index.json", "r", encoding="utf-8") as file:
  shelf_index = json.load(file)

print("Ledger text:")
print(ledger_text)
print("Shelf index:", shelf_index)

ledger_lines = ledger_text.splitlines()
print("Ledger lines:", ledger_lines)


def clean_line(raw_line):
  return raw_line.strip().replace("## ", "").replace("~", " ").replace("??", "")


def build_entry(cleaned_line):
  parts = cleaned_line.split(" | ")
  item_name = parts[0].split("=")[1]
  shelf_code = parts[1].split("=")[1]
  status = parts[2].split("=")[1]
  shelf_record = shelf_index[shelf_code]
  keeper_name = shelf_record["keeper_name"]
  room_name = shelf_record["room_name"]

  return {
      "item_name": item_name,
      "shelf_code": shelf_code,
      "status": status,
      "keeper_name": keeper_name,
      "room_name": room_name,
  }


cleaned_lines = [
  clean_line(ledger_lines[0]),
  clean_line(ledger_lines[1]),
  clean_line(ledger_lines[2]),
]

organized_entries = [
  build_entry(cleaned_lines[0]),
  build_entry(cleaned_lines[1]),
  build_entry(cleaned_lines[2]),
]

ready_entries = [
  entry
  for entry in organized_entries
  if entry["status"] == "ready"
]

ledger_summary = {
  "entry_count": len(organized_entries),
  "ready_count": len(ready_entries),
  "first_keeper": organized_entries[0]["keeper_name"],
  "last_room": organized_entries[2]["room_name"],
}

print("Cleaned lines:", cleaned_lines)
print("Organized entries:", organized_entries)
print("Ready entries:", ready_entries)
print("Ledger summary:", ledger_summary)
高级技巧
想更进一步?点击展开

这节课最重要的变化,不是代码更长了,而是你开始同时调动多种旧能力:清文本、拆字段、查记录、再把结果组织成清楚输出。

这就是档案馆试炼的起点。下一课还会继续做综合,但重点仍然不是新知识,而是你会不会选结构、会不会把步骤安排得更稳。

Loading...
终端输出
Terminal
Ready to run...