不使用Python CSV模块处理CSV数据:生成含None的结构化元组列表
解决方案:处理CSV数据并生成结构化元组列表
我来帮你把这个CSV处理功能完善好,分两部分解决你的需求,同时补全你写的代码片段:
一、需求1:不使用CSV模块导入CSV,返回字符串/整数类型列表
首先实现一个函数,读取CSV文件后分别返回两个列表:一个保留所有元素的字符串类型(空值替换为None),另一个将可转换为整数的元素转为整数(空值和无法转换的元素设为None)。
def load_csv_as_lists(file_path): string_rows = [] integer_rows = [] with open(file_path, 'r') as file: for line in file: # 分割每行,保留空元素(对应CSV中的空值) raw_elements = line.strip().split(' ') str_row = [] int_row = [] for elem in raw_elements: # 处理字符串行:空元素转None,否则保留原字符串 str_row.append(elem if elem else None) # 处理整数行:尝试转整数,失败/空元素则为None if not elem: int_row.append(None) else: try: int_row.append(int(elem)) except ValueError: int_row.append(None) string_rows.append(str_row) integer_rows.append(int_row) return string_rows, integer_rows
使用示例
# 调用函数 str_list, int_list = load_csv_as_lists("your_student_file.csv") # 打印结果 print("字符串类型列表:") for row in str_list: print(row) print("\n整数类型列表:") for row in int_list: print(row)
二、需求2:生成指定格式的结构化元组列表
接下来完善你写的student_mark函数,实现将CSV数据转换为(姓名, 分数1, 分数2, 分数3, 分数4, 分数5)格式的元组列表,满足:
- 姓名用双引号包裹
- 空值替换为
None - 分数自动转为整数
def student_mark(studentfile): result_tuples = [] with open(studentfile, 'r') as file: for line in file: raw_elements = line.strip().split(' ') student_name = None scores = [] # 遍历元素,提取姓名和分数 for elem in raw_elements: # 第一个非空元素作为姓名,包裹双引号 if not student_name and elem: student_name = f'"{elem}"' else: # 处理分数:空元素转None,非空转整数 if elem: try: scores.append(int(elem)) except ValueError: scores.append(None) else: scores.append(None) # 确保分数列表长度为5,不足补None,多余截断 while len(scores) < 5: scores.append(None) scores = scores[:5] # 构造元组并加入结果 student_tuple = (student_name,) + tuple(scores) result_tuples.append(student_tuple) return result_tuples
使用示例
假设你的CSV文件内容为:
Jim 57 83 55 78 John 98 91 80 Michael 61 88 80 60
调用函数后会返回:
[('"Jim"', 57, None, 83, 55, 78), ('"John"', None, 98, 91, 80, None), ('"Michael"', 61, None, 88, 80, 60)]
完全符合你给出的示例格式要求。
内容的提问来源于stack exchange,提问作者Jim Ye
相关产品推荐
相关产品推荐

