在实现上传人脸图片,并将该图片进行编码存入字典中时,由于信息都是临时存取,关了后台之后字典的信息全被清空。所以想将该字典内容存入json中 。在网上查阅资料发现好多都是将字典dict转化为json进行存储,于是我犯了个错误,每次将字典{"1":""}{"1":"","2":""}{"1":"","2":"","3":""}存进json,不仅造成存储内容重复,而且json格式错误,报错。
所以明确了一下需求,只需要将每次新加入的键值对存进json文件中,即在原有json文件中追加内容。
参考原博文:python对json格式原文件追加内容_一转眼再次遇到你-CSDN博客_python追加json
下面把原博文贴出来:
import json
with open('test2.json','a+',encoding="utf-8") as f:
f.seek(0) # 因为是追加方式打开,默认偏移量再最后面,我们调整到开头
if f.read() =='': # 判断是否为空,如果为空的话创建一个新的字典格式
print('执行了吗')
data = {}
else:
f.seek(0)
data = json.load(f)
print(data)
data['a']="我爸是赵四"
data['b']="我爸是李刚" # 可以在第二遍运行时修改一下看看效果
data['e']="我爸是李刚"
data['f'] = {'a':'嵌套啊'}
print(data)
f.seek(0)# 设置文件当前位置 0代表开始处 其实有两个参数 offset,whence (whence常用有三个参数0,1,2;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。)
# 如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。
f.truncate() # 从开头截断,截断文件为size个字符,无参代表 从当前位置截断,截断之后后面的所有字符都被删除
json.dump(data,f,indent=2,ensure_ascii=False)
第一次运行:
修改后第二次运行:添加内容
以上是原作者博文。
参考代码进行了修改:
# 将新加入图片生成的编码信息和姓名存入json中-----------
print(time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) + ' 将编码信息和姓名存入json')
with open('faceCode.json', 'a+', encoding="utf-8") as f:
f.seek(0) # 因为是追加方式打开,默认偏移量在最后面,我们调整到开头
if f.read() == '': # 判断是否为空,如果为空的话创建一个新的字典格式
print('执行了吗')
data = {} #定义一个字典,临时存储人脸编码
else:
f.seek(0)
data = json.load(f)
print(data)
data[name] =face_encodings[0].tolist() #json不认识numpy的array,所以转为list
print(data)
f.seek(0) # 设置文件当前位置 0代表开始处 其实有两个参数 offset,whence (whence常用有三个参数0,1,2;0 代表从文件开头开始算起,1 代表从当前位置开始算起,2 代表从文件末尾算起。)
# 如果操作成功,则返回新的文件位置,如果操作失败,则函数返回 -1。
f.truncate() # 从开头截断,截断文件为size个字符,无参代表 从当前位置截断,截断之后后面的所有字符都被删除
#json.dump把字典转换成json字符串并存储在文件中
json.dump(data, f, indent=2, ensure_ascii=False) #,ensure_ascii=False为不确保ascii,及不将中文等特殊字符转为\uXXX等
#indent为多行缩进空格数,不写则为一行
f.close()
解析json:
with open("faceCode.json", encoding="utf-8") as f:
face_ecoding_lib = json.load(f)
f.close()
print(face_ecoding_lib)
(记得open完最好close一下,原先我老是不close)
附json学习链接:Python json读写方式和字典相互转化_Simple的博客-CSDN博客