Python从CSV文件随机抽取单个学生姓名 解决文件无len()报错问题
问题原因
你遇到的报错是因为csv.reader返回的是迭代器对象,不是可随机访问的序列结构:
random.shuffle()要求输入对象支持长度查询(__len__方法)、元素赋值等可变序列特性,迭代器不满足该要求- 你在
for循环里遍历迭代器的同时调用shuffle的逻辑也存在错误,迭代器只能遍历一次,遍历完成后就为空了
正确实现代码
思路非常直接:先把所有学生姓名读取存储到Python列表里,再用random.choice()直接从列表里随机选1个元素即可,无需手动shuffle:
import csv import random # 读取CSV存入学生列表 students = [] with open('1st_period.csv', 'r', encoding='utf-8') as student_csv_file: csv_reader = csv.reader(student_csv_file) next(csv_reader) # 跳过表头行 for row in csv_reader: if row: # 跳过空行避免报错 students.append(row[0]) # 随机抽取1名学生 if students: selected = random.choice(students) print(f"本次抽取到的朗读学生是:{selected}") else: print("当前没有提交意愿的学生")
可选优化点
- 如果需要连续抽取不重复的学生(直到所有学生都抽过一轮),可以先shuffle列表再按顺序取:
random.shuffle(students) # 每次调用pop取一个,直到列表为空 selected = students.pop() print(selected) - 如果后续CSV调整为两列存储姓和名,只要把
row[0]改成f"{row[0]} {row[1]}"拼接即可
内容的提问来源于stack exchange,提问作者Joshua Mitchell
相关产品推荐
相关产品推荐

