
本文详解如何读取逗号分隔的飞机数据文本文件,按机型归类统计出现次数及总航程,并构建形如 {"Honda": (3, 1304.8)} 的结构化字典。
本文详解如何读取逗号分隔的飞机数据文本文件,按机型归类统计出现次数及总航程,并构建形如 `{"honda": (3, 1304.8)}` 的结构化字典。
要实现从纯文本(CSV 风格)文件中提取机型与航程数据,并汇总为“机型 → (出现次数, 总航程)”的字典结构,关键在于边读取、边解析、边聚合——无需先存为列表再处理,既节省内存又提升可读性与健壮性。
以下是一个完整、安全且符合 Python 最佳实践的实现方案:
aircraft_dict = {}
with open("aircraft_data.txt", "r", encoding="utf-8") as infile:
for line_num, line in enumerate(infile, 1):
line = line.strip()
if not line: # 跳过空行
continue
try:
aircraft, mileage_str = line.split(",", 1) # 使用 maxsplit=1 防止机型名含逗号
aircraft = aircraft.strip()
mileage = float(mileage_str.strip())
except ValueError as e:
print(f"警告:第 {line_num} 行格式错误({line!r}),已跳过 — {e}")
continue
# 聚合逻辑:首次出现则初始化,否则累加
if aircraft in aircraft_dict:
count, total = aircraft_dict[aircraft]
aircraft_dict[aircraft] = (count + 1, total + mileage)
else:
aircraft_dict[aircraft] = (1, mileage)
print(aircraft_dict)
# 示例输出:{'Cessna': (2, 455.4), 'Velocity': (3, 1155.2), 'Beechcraft': (1, 467.2),
# 'Gulfstream': (2, 1229.5), 'Honda': (3, 1304.8), 'Camry': (1, 4.2)}✅ 核心要点说明:
- 使用
with open(...)确保文件自动关闭,避免资源泄漏; -
encoding="utf-8"显式指定编码,防止中文或特殊字符报错; -
line.split(",", 1)设置maxsplit=1,可兼容机型名中意外含逗号的情况(如"Honda Jet, G300"); -
strip()清除首尾空格,提升数据鲁棒性; -
try/except捕获解析异常(如非数字航程、缺失字段),并打印带行号的友好提示,便于调试; - 字典值直接存储元组
(count, total_mileage),语义清晰、不可变、内存高效。
? 进阶建议(可选优化):
若数据量较大或需频繁更新,可改用 collections.defaultdict 或 collections.Counter 配合 sum() 实现更简洁逻辑:
from collections import defaultdict
counts = defaultdict(int)
totals = defaultdict(float)
with open("aircraft_data.txt") as f:
for line in f:
if not line.strip():
continue
aircraft, mileage = line.strip().split(",", 1)
counts[aircraft.strip()] += 1
totals[aircraft.strip()] += float(mileage.strip())
aircraft_dict = {k: (counts[k], totals[k]) for k in counts}最终生成的字典完全满足需求:每个键为机型名称,对应值为二元元组,分别表示该机型在文件中出现的总次数与航程总和。此模式可轻松迁移至其他类似聚合场景(如销售统计、日志分析等)。
立即学习“Python免费学习笔记(深入)”;


















