如何在不将CSV文件全部加载到内存的情况下高效计算用户年龄中位数
技术百科
碧海醫心
发布时间:2026-01-27
浏览: 次 本文介绍如何使用python的csv.dictreader流式读取tsv文件,避免内存占用过高,同时解决“_csv.reader对象不可索引”错误,正确计算用户年龄中位数。
在处理大型CSV/TSV文件时,为节省内存,我们通常希望逐行读取、即时计算,而非一次性加载全部数据(如pandas.read_csv()或list(csv.reader()))。但初学者常误用csv.reader——它返回的是按列索引的列表(如row[2]),而代码中却尝试像字典一样用键名访问(如row['birth_year']),从而触发 TypeError: '_csv.reader' object is not subscriptable 错误。
根本原因在于:csv.reader 生成的每一行是 list 类型(例如 ['paul', 'henry', '2019']),不支持 row['birth_year'] 这种键访问;而 csv.DictReader 才会将首行自动解析为字段名,并为后续每行返回一个 dict(如 {'first': 'paul', 'last': 'henry', 'birth_year': '2019'}),真正

✅ 正确做法是改用 csv.DictReader,并配合生成器表达式实现内存友好的流式计算:
import csv
from statistics import median
def median_age(filename):
with open(filename, 'r', encoding='utf-8') as file:
reader = csv.DictReader(file, delimiter='\t')
# 使用生成器:逐行读取,即时计算年龄,不构建完整列表
ages = (2025 - int(row['birth_year']) for row in reader)
return median(ages)? 关键要点说明:
- ✅ csv.DictReader 自动将第一行作为字段名(header),无需手动跳过(next(reader) 不再需要);
- ✅ 生成器 (2025 - int(...)) for row in reader 不会缓存所有年龄值,仅维持迭代状态,内存占用恒定(O(1));
- ✅ 建议显式指定 encoding='utf-8' 避免中文或特殊字符报错;
- ⚠️ 确保输入文件中存在名为 'birth_year' 的列(大小写敏感),否则抛出 KeyError;可添加异常处理增强鲁棒性:
# 可选:增加字段校验与容错
if 'birth_year' not in reader.fieldnames:
raise ValueError(f"Column 'birth_year' not found in header: {reader.fieldnames}")? 示例运行(以制表符分隔的 data.csv):
first last birth_year paul henry 2019 bill thompson 1995 mary allen 2003 jennifer davis 2015 liz morgan 1999
调用 median_age('data.csv') 将依次计算年龄 [5, 29, 21, 9, 25],中位数为 21(已排序后取中间值)。
总结:流式处理大数据CSV的核心是「用对工具」——DictReader 提供语义化访问,生成器确保低内存开销,二者结合即可安全、高效、可维护地完成年龄统计任务。
# ai
# 的是
# 可选
# 大数据
# 并为
# python
# 过高
# 而非
# 会将
# 不支持
# 工具
# 对象
# int
# 内存占用
# 报错
# Object
# 流式
# for
# csv
# pandas
# 字段名
# csv文件
相关栏目:
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
AI推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
SEO优化<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
技术百科<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
谷歌推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
百度推广<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
网络营销<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
案例网站<?muma echo $count; ?>
】
<?muma
$count = M('archives')->where(['typeid'=>$field['id']])->count();
?>
【
精选文章<?muma echo $count; ?>
】
相关推荐
- MAC怎么使用表情符号面板_MAC Emoji快捷
- c++怎么实现大文件的分块读写_c++ 文件指针s
- PHP的FastAdmin架构适合二次开发吗_特点
- Win11怎么清理C盘系统错误报告_Win11清理
- Win11怎么清理C盘OneDrive缓存_Win
- Windows家庭版如何开启组策略(gpedit.
- c# 在高并发场景下,委托和接口调用的性能对比
- mac怎么安装pip_MAC Python pip
- 短链接怎么用php还原_从基础原理到代码实现教学【
- Win11怎么设置默认PDF阅读器 Win11修改
- Windows10电脑怎么设置虚拟内存_Win10
- php能控制zigbee模块吗_php通过串口与c
- Win11任务栏怎么调到左边_Win11开始菜单居
- Python对象比较与排序_魔术方法解析【教程】
- 如何在 Pandas 中按元素交集合并两列字符串
- Windows10怎样连接蓝牙设备_Windows
- Win11怎么快速锁屏_Win11一键锁屏快捷键W
- Win11怎么更改默认打开方式_Win11关联文件
- php怎么下载安装后无法解析php文件_服务器配置
- Windows 11如何开启文件夹加密(EFS)_
- Win11怎么设置默认邮件应用_Windows11
- 如何将竖排文本文件转换为横排字符串
- Win11怎么设置DNS服务器_Windows11
- 如何使用Golang包导出规则_控制函数和变量可见
- Win11怎么更改盘符_Win11磁盘管理修改驱动
- 如何更改Windows资源管理器的默认启动位置?(
- Python爬虫项目实战教程_Scrapy抓取与存
- Win11如何设置自动关机 Win11定时关机命令
- Go 中 := 短变量声明的类型推导机制详解
- Windows10系统怎么查看运行时间_Win10
- Windows 11如何查看系统激活密钥_Wind
- Win10系统怎么查看网络连接状态_Windows
- Win11怎么解压RAR文件 Win11自带解压功
- Windows怎样拦截WPS弹窗广告_Window
- Python对象比较与排序_集合使用说明【指导】
- Win11屏幕亮度突然变暗怎么解决_自动变暗问题处
- 如何使用Golang reflect检查方法数量_
- Windows10蓝屏代码DPC_WATCHDOG
- Win10怎么卸载金山毒霸_Win10彻底卸载金山
- 微信短链接怎么还原php_用浏览器开发者工具抓包获
- VSC怎样在VSC中调试PHPAPI_接口调试技巧
- Go语言中CookieJar的持久化机制解析:内存
- Win11怎么关闭通知消息_屏蔽Windows 1
- Mac怎么设置鼠标滚动速度_Mac鼠标设置详细参数
- Windows10如何更改桌面图标间距_Win10
- php增删改查需要哪些扩展_开启mysqli或pd
- PHP主流架构怎么处理表单验证_规则与自定义【技巧
- PHP主流架构怎么监控运行状态_工具推荐【操作】
- Python对象生命周期管理_创建销毁解析【教程】
- Python抽象类与接口设计_规范说明【指导】

QQ客服