Python如何将txt文件读取的元素存入数组/矩阵(手动实现split)
问题背景
现有Names.txt文件,每行以空格分隔4个字段,分别为姓名、数值1、数值2、州编码,示例内容如下:
Smith 25 35 NC Johnson 12 4 OH Jones 23 14 FL Lopez 2 7 TX
需求为逐行读取文件,忽略空白字符,将每行的4个字段存入尺寸为4×总人数的列表/矩阵结构中;要求不使用内置split()方法,使用自定义实现的split1函数完成字符串分割。原有代码存在逻辑缺失,需要补全实现,也可参考更优的实现方案。
原有代码存在的核心问题
- 第一次循环遍历文件统计人数后,文件指针已经移动到文件末尾,第二次循环直接调用
readline()读不到任何内容,要么需要调用f.seek(0)将指针复位到文件开头,要么可以优化为单次遍历同时完成计数和内容存储 - 调用
split1时传入的分隔符为空字符串,不符合空格分隔的实际场景;同时没有处理每行末尾的换行符、连续空格产生的空分割结果,也没有将分割后的字段存入目标结构 - 人数统计逻辑没有跳过空行,文件中存在空行时会导致计数不准
- 手动写死循环判断文件结束的逻辑冗余,可简化。
基于原有逻辑修复的可运行代码
保留原编写的split1函数实现,补全存储逻辑,修复上述问题:
def split1(line,delim): s=[] j=0 for i in range (len(line)): if delim== line [i]: s.append(line[j:i]) j=i+1 s.append (line[j:]) return s # 初始化4×N矩阵:4行分别对应姓名、数值1、数值2、州编码,每行长度等于总人数 result_matrix = [[], [], [], []] f = open("Names.txt", "r") all_lines = f.readlines() f.close() for raw_line in all_lines: # 去除每行首尾的换行、空格等空白字符 line = raw_line.strip() # 跳过空行,避免无效计数 if not line: continue # 按空格分割,过滤连续空格产生的空串 parts = [item for item in split1(line, ' ') if item] # 跳过格式不符合4个字段的异常行 if len(parts) != 4: print(f"跳过格式异常行:{line}") continue # 字段存入对应行,数值字段可按需转成整型 result_matrix[0].append(parts[0]) result_matrix[1].append(int(parts[1])) result_matrix[2].append(int(parts[2])) result_matrix[3].append(parts[3]) # 验证输出 print("读取完成,矩阵内容如下:") print("姓名列:", result_matrix[0]) print("数值1列:", result_matrix[1]) print("数值2列:", result_matrix[2]) print("州编码列:", result_matrix[3])
运行后输出结果和示例文件匹配:
读取完成,矩阵内容如下: 姓名列: ['Smith', 'Johnson', 'Jones', 'Lopez'] 数值1列: [25, 12, 23, 2] 数值2列: [35, 4, 14, 7] 州编码列: ['NC', 'OH', 'FL', 'TX']
更优实现参考
使用文件上下文管理器自动处理文件关闭,逐行读取无需一次性加载全量文件,内存占用更低,代码更简洁:
def split1(line,delim): s=[] j=0 for i in range (len(line)): if delim== line [i]: s.append(line[j:i]) j=i+1 s.append (line[j:]) return s result_matrix = [[], [], [], []] # with语句会在代码块结束后自动关闭文件,无需手动调用close with open("Names.txt", "r") as f: for raw_line in f: line = raw_line.strip() if not line: continue parts = [item for item in split1(line, ' ') if item] if len(parts) != 4: continue result_matrix[0].append(parts[0]) result_matrix[1].append(int(parts[1])) result_matrix[2].append(int(parts[2])) result_matrix[3].append(parts[3])
内容的提问来源于stack exchange,提问作者DA2489
相关产品推荐
相关产品推荐

