混合账本
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.txt 和 shelf_index.json。你要补完两步小工具,再把它们串起来:先完成 clean_line(raw_line),再完成 build_entry(cleaned_line),最后做出 cleaned_lines、organized_entries、ready_entries 和 ledger_summary。
三条账本行都带着同一种噪声:前缀 "## "、挤在一起的 "~"、以及尾部的 "??"。先在 clean_line(raw_line) 里把这一套清理动作写好。
在 build_entry(cleaned_line) 里,先用 split(" | ") 拆成三段,再用 split("=") 读出 item_name、shelf_code 和 status。
仅靠文本行,你只知道物品、货架代码和状态。再用 shelf_index[shelf_code] 把 keeper_name 和 room_name 补进来,让结果变成一条更完整的记录。
用三条清理后的行做出 organized_entries 列表,再筛出 ready_entries,最后整理 ledger_summary。这就是这节课真正想让你感受到的:文本、记录和结果组织已经开始一起工作了。
这节课不引入新概念,也不把你丢进大型项目。我们只把你前面学过的动作拉到同一个小任务里,让你明显感觉到:我已经不只是在做零散练习,而是在用整门 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)高级技巧想更进一步?点击展开点击收起
这节课最重要的变化,不是代码更长了,而是你开始同时调动多种旧能力:清文本、拆字段、查记录、再把结果组织成清楚输出。
这就是档案馆试炼的起点。下一课还会继续做综合,但重点仍然不是新知识,而是你会不会选结构、会不会把步骤安排得更稳。