如何解决np.savetxt保存字符串与数值混合数据的类型不匹配错误?
问题描述
我在Python中有一个混合类型列表:
inputs = ['eos', 5, 10, 20, 30]
其中第一个元素是字符串,其余为整数。我希望将该列表保存到文件后,在另一Python笔记本中读取,能够通过inputs[i]调用对应元素,且元素保持原类型(如inputs[0]返回字符串"eos",inputs[1]返回整数5)。
尝试用以下代码保存列表时出现错误:
np.savetxt(path + '/inputs.txt', inputs, delimiter=" ", header = 'Eos N1 N2 N3 N4')
错误信息:
TypeError: Mismatch between array dtype ('<U32') and format specifier ('%.18e')
解决方案
方法1:使用pickle(推荐,简单直接)
pickle可直接序列化Python对象,完美保留类型信息:
保存代码:
import pickle inputs = ['eos', 5, 10, 20, 30] save_path = path + '/inputs.pkl' with open(save_path, 'wb') as f: pickle.dump(inputs, f)
读取代码:
import pickle load_path = path + '/inputs.pkl' with open(load_path, 'rb') as f: inputs = pickle.load(f) # 验证类型 print(type(inputs[0])) # <class 'str'> print(type(inputs[1])) # <class 'int'>
方法2:使用json(纯文本格式,可读性好)
json支持字符串、整数等基础类型,读取后可保持原类型:
保存代码:
import json inputs = ['eos', 5, 10, 20, 30] save_path = path + '/inputs.json' with open(save_path, 'w') as f: json.dump(inputs, f)
读取代码:
import json load_path = path + '/inputs.json' with open(load_path, 'r') as f: inputs = json.load(f) # 验证类型 print(type(inputs[0])) # <class 'str'> print(type(inputs[1])) # <class 'int'>
方法3:自定义文本读写(手动处理类型)
若需要纯文本格式,可手动写入并解析:
保存代码:
inputs = ['eos', 5, 10, 20, 30] save_path = path + '/inputs.txt' # 将元素转为字符串后写入 with open(save_path, 'w') as f: f.write('Eos N1 N2 N3 N4\n') # 写入表头 f.write(' '.join(map(str, inputs)) + '\n')
读取代码:
load_path = path + '/inputs.txt' with open(load_path, 'r') as f: next(f) # 跳过表头 line = f.readline().strip() parts = line.split() # 手动转换类型:第一个为字符串,其余转整数 inputs = [parts[0]] + list(map(int, parts[1:])) # 验证类型 print(type(inputs[0])) # <class 'str'> print(type(inputs[1])) # <class 'int'>
原代码报错原因
np.savetxt主要用于保存数值型numpy数组,当传入混合类型列表时,numpy会将整个数组转为字符串类型(<U32表示长度32的Unicode字符串),但默认格式说明符%.18e是针对浮点数的,字符串无法适配该格式,因此出现类型不匹配错误。
内容的提问来源于stack exchange,提问作者Ramos
相关产品推荐
相关产品推荐

