利用json读写字典数据(处理ndarry等非内置类型数据)

当Python字典中包含numpy数组时,使用json进行序列化会报错。为了解决这个问题,可以自定义NpEncoder类,重写default方法以处理ndarray对象。通过将ndarray转换为list,然后利用json.dump()写入文件。读取时,再将list转换回ndarray。这种方法确保了数据的正确读写。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

对于python中的字典数据的读写问题,一种常见的方法是通过json包来对其进行读写。

但是当字典中的数据包含ndarry对象时,直接利用json包读写时,会报TypeError: Object of type ‘ndarray‘ is not JSON serializable的错误。

这是因为ndaary对象类型无法进行json序列化。解决办法就是继承json.JSONEncoder,对其中的default方法进行重写,增加对numpy中的对象进行序列化的操作。

具体实现如下:

import numpy as np
import json
import codecs
parameters = {'w1': np.arange(10), 'w2': np.array([[1, 2, 3], [3, 2, 1]])}
class NpEncoder(json.JSONEncoder):
    def default(self, obj):
        if isinstance(obj, np.integer):
            return int(obj)
        elif isinstance(obj, np.floating):
            return float(obj)
        elif isinstance(obj, np.ndarray):
            return obj.tolist()
        else:
            return super(NpEncoder, self).default(obj)


# 字典写入文件
with codecs.open("./para_new.csv", 'w', encoding='utf-8') as f:
    json.dump(parameters, f, cls=NpEncoder)

# 读取字典
file = open("./para_new.csv", 'r')
js = file.read()
dict_num = json.loads(js)

# 读取的数据,由于序列化操作,所以ndarry对象变为了list对象
print(type(dict_num['w1']))


# 将字典中的数据类型,变为原来的格式
for i in dict_num.keys():
    dict_num[i] = np.array(dict_num[i])

print(type(dict_num['w1']))

运行结果
在这里插入图片描述
其中关于ndarry对象的tolist方法,可以参考我的这篇博客https://blog.csdn.net/qq_38048756/article/details/107798597

参考:
https://blog.csdn.net/mochou111/article/details/100984538
https://blog.csdn.net/qq_29631521/article/details/103169161

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习的贝塔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值