保存/读取numpy ndarray至文本文件时行数减少1行的问题
问题原因拆解
咱们来捋下行数减少的问题,主要踩了这几个坑:
- 误跳过第一行数据:你用
f.readline()想跳过“表头”,但实际上np.savetxt保存这个数组时根本没写表头,这直接把第一行数据给跳过了,总行数自然少了1——这是最直接的原因。 - 数据类型不匹配(隐藏风险):你保存的是字符串类型数组(字典键大多是字符串,而且指定了
fmt='%s'),但读取时np.loadtxt()默认会按浮点数解析。如果你的键不是纯数字字符串,轻则读取报错,重则可能导致部分行被异常忽略,间接影响行数统计。 - 文件路径不一致:保存的路径是
'filepath/file.txt',读取的却是"step_2/Part_DBS/S3_DBs/GO_For_SVM.txt"——如果这俩不是同一个文件,那你读的本来就是行数更少的文件,也会出现这个问题。 - 变量名踩坑:你用了
dict当变量名,这会覆盖Python内置的dict类,后续再想创建字典就会出问题,这是个容易忽略的隐藏bug。
修复后的代码方案
针对这些问题,给你调整好的代码:
#!/usr/bin/env python import numpy as np # 重点:别用dict当变量名,换成my_dict这类自定义名字 my_dict = {"apple": 1, "banana": 2, "cherry": 3} # 示例字典,替换成你的实际字典 dictkey = my_dict.keys() Xarr = np.array(dictkey).reshape(-1, 1) print("保存前数组形状:", Xarr.shape) # 统一文件路径,避免路径不一致的问题 file_path = "step_2/Part_DBS/S3_DBs/GO_For_SVM.txt" np.savetxt(file_path, Xarr, fmt='%s') # 读取时不要跳过行,并且指定dtype=str读取字符串类型 X = np.loadtxt(file_path, dtype=str) # 重新reshape保持(R,1)的形状 X = X.reshape(-1, 1) print("读取后数组形状:", X.shape)
如果后续你需要给文件加表头(比如和其他工具兼容),可以这么写:
# 保存时添加表头 np.savetxt(file_path, Xarr, fmt='%s', header='dict_keys') # 读取时用skiprows=1跳过表头行 X = np.loadtxt(file_path, dtype=str, skiprows=1).reshape(-1,1)
这样就能保证保存和读取的行数完全一致啦。
内容的提问来源于stack exchange,提问作者Julia
相关产品推荐
相关产品推荐

