json.decoder.JSONDecodeError: Extra data: line 1 column 332 (char 331)
项目场景:
提示:扩充数据集时,同步修改json标签中的"imagePath"字段的值,出现json文件读写不一致问题。
采用open函数读写模式修改json文件字段。open('jsonF.json', 'r+')
。
问题描述
运行修改json文件报错:json.decoder.JSONDecodeError: Extra data: line 1 column 332 (char 331)
源代码:
with open((os.path.join(dir_path, '142' + file_name)), 'r+') as jsonFile:
data = json.load(jsonFile)
data["imagePath"] = '142' + imagePath
json.dump(data, jsonFile, ensure_ascii=False)
原因分析:
需要了解open函数读写文件模式,和文件之指针:
- json库load加载json文件后(
data = json.load(jsonFile)
),又访问了 data[“imagePath”] 。此时,文件指针指向了data[“imagePath”]的下一行。这时,直接转存数据json.dump(data, jsonFile)
,文件指针位置不对。所以,会报错。 - 当你loads json文件时出现json.decoder.JSONDecodeError,也可能是因为存储时值没有加双引号,可能是因为值里面有特殊字符,比如"等。
解决方案:
移动文件指针到开始位置
jsonFile.seek(0)
,转存数据传入参数ensure_ascii=False
,之后调用截断函数jsonFile.truncate()
防止写入其他东西。:
with open((os.path.join(dir_path, '142' + file_name)), 'r+') as jsonFile:
data = json.load(jsonFile)
data["imagePath"] = f"142{imagePath}"
jsonFile.seek(0) # rewind
json.dump(data, jsonFile,ensure_ascii=False)
jsonFile.truncate()