未完整导入CSV到内存计算年龄时遇TypeError错误求助
错误原因与修复方案
核心错误
你代码里的data['birth_year']是完全错误的用法:csv.reader返回的是一个迭代器,每次迭代出来的row是列表(按列顺序排列的字段值),不是字典,既不能直接对data对象做下标访问,也不能用列名来取列表里的元素。同时你写反了生成器的逻辑,应该先遍历data里的每一行row,再对row做操作。
两种修复方式
方式一:改用csv.DictReader(推荐,更直观)
DictReader会自动把每一行转换成字典,键就是表头的字段名,直接用列名取值即可,完全不用关心列的位置:
import csv import statistics def median_age(filename): with open(filename, 'r') as file: # 用DictReader处理,自动映射表头与字段值 data = csv.DictReader(file, delimiter='\t') # 遍历每一行字典,按列名获取birth_year计算年龄 customer_age = (2024 - int(row['birth_year']) for row in data) median_customer_age = statistics.median(customer_age) return median_customer_age
方式二:继续用csv.reader,按列索引取值
如果你知道birth_year在表头后的第几列(比如是第2列,索引从0开始就是1),可以直接用列表下标访问:
import csv import statistics def median_age(filename): with open(filename, 'r') as file: data = csv.reader(file, delimiter='\t') next(data) # 跳过表头行 # 按索引取对应列的值,这里假设birth_year在第2列(索引1) customer_age = (2024 - int(row[1]) for row in data) median_customer_age = statistics.median(customer_age) return median_customer_age
额外说明
两种方案都保留了生成器的特性——不会把整个CSV文件加载到内存,完全符合你的需求。
内容的提问来源于stack exchange,提问作者Lanxin Ma
相关产品推荐
相关产品推荐

