You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 16:54:08