如何用Python将文本文件中的学生数据读取为指定格式的二维列表
解决思路与代码实现
你的需求是从格式为name: Joe score: 77 class: Jupiter name: Jess score: 87 class: Neptune ……的文本文件中提取信息,生成两个指定结构的列表。之前的代码思路有个小问题:按行拆分": "会把同一行里的后续键值对混在一起,比如Joe score会被当成一个值,这显然不符合预期。下面给你两种可靠的实现方式:
方法一:正则表达式(推荐,适配多种排版)
正则可以精准匹配所有key: value格式的内容,不管信息是在一行还是多行:
import re list1 = [] list2 = [] # 用with语句安全读取文件,自动处理关闭操作 with open("student.txt", "r") as stud_file: # 读取整个文件内容 content = stud_file.read() # 匹配所有符合"键: 值"格式的内容,捕获键和值 all_kv = re.findall(r'(\w+): (\w+)', content) # 每3组键值对对应一个学生的信息(name/score/class) for idx in range(0, len(all_kv), 3): name = all_kv[idx][1] # 把score转成整数类型,符合你要的数字格式 score = int(all_kv[idx+1][1]) class_name = all_kv[idx+2][1] list1.append([name, score]) list2.append([name, class_name]) # 验证结果 print("list1:", list1) print("list2:", list2)
方法二:字符串拆分法(无需依赖正则)
如果不想用正则,也可以通过拆分字符串来提取键值对:
list1 = [] list2 = [] with open("student.txt", "r") as stud_file: # 读取内容并把换行换成空格,统一处理跨换行的信息 content = stud_file.read().replace('\n', ' ') # 按空格拆分所有片段,得到类似['name:', 'Joe', 'score:', '77', ...]的列表 parts = content.split() # 两两配对生成键值对,去掉键后面的冒号 kv_pairs = [] for j in range(0, len(parts), 2): key = parts[j].rstrip(':') value = parts[j+1] kv_pairs.append((key, value)) # 同样按每3组键值对处理一个学生 for idx in range(0, len(kv_pairs), 3): name = kv_pairs[idx][1] score = int(kv_pairs[idx+1][1]) class_name = kv_pairs[idx+2][1] list1.append([name, score]) list2.append([name, class_name]) # 验证结果 print("list1:", list1) print("list2:", list2)
关键说明
- 两种方法都用了
with open(...)语法,这是Python处理文件的最佳实践,能自动关闭文件,避免资源泄漏。 - 因为每个学生对应
name/score/class三个属性,所以我们按每3组键值对为一个单元来处理,确保每个学生的信息对应正确。 - 把
score转成整数int(),这样list1里的分数就是数字类型,符合你给出的示例格式。
内容的提问来源于stack exchange,提问作者clink
相关产品推荐
相关产品推荐

