如何从CSV文件读取数据并创建对应存储对象
实现方案
核心逻辑
- 首行通过正则提取所有非空字段,自动确定
Number/Semester/Grade的排列顺序,不需要硬编码位置 - 后续每行统一用正则拆分过滤后,和首行的字段索引一一映射即可完成数据提取
- 存储结构优先推荐字典列表,读写灵活适配大多数场景;如果需要更高的可维护性可以用数据类定义结构化对象
代码实现(Python)
import re from dataclasses import dataclass # 可选:定义结构化数据类,比字典更易做类型校验和后续调用 @dataclass class CourseScore: number: int semester: str grade: str result = [] field_mapping = {} with open("你的文件路径.csv", "r", encoding="utf-8") as f: for line_idx, line in enumerate(f): # 用正则按连续分号拆分,过滤空值拿到当前行的有效内容 valid_parts = [p for p in re.split(r";+", line.strip()) if p] if not valid_parts: continue # 处理表头行,记录每个字段对应的索引位置 if line_idx == 0: for idx, field in enumerate(valid_parts): field_mapping[field.lower()] = idx continue # 处理数据行,按表头映射取值 num = int(valid_parts[field_mapping["number"]]) semester = valid_parts[field_mapping["semester"]] grade = valid_parts[field_mapping["grade"]] # 存入结果,两种存储方式二选一即可 # 方式1:存字典 result.append({ "number": num, "semester": semester, "grade": grade }) # 方式2:存结构化数据类实例 # result.append(CourseScore(number=num, semester=semester, grade=grade)) # 输出验证 print(result)
优化建议
- 如果CSV格式固定只有这三个有效字段,不需要兼容后续字段调整,可以直接用正则匹配提取每行的三个值,代码更简洁:
匹配正则可写为r"(\d+);+([IVX]+);+([ABCDF])",直接提取三个分组的内容即可 - 如果你不需要做复杂的格式兼容,直接用Python内置的
csv模块指定分隔符为;,过滤空列的写法更轻量,不需要额外引入正则处理
内容的提问来源于stack exchange,提问作者Vlada Misici
相关产品推荐
相关产品推荐

