一、前言
最近想用json存储接口关联的变量数据,查了一下网上许多伙伴的文章,最后总是某个地方容易报错。最后发现还是大部分网友摘抄别人的细节问题,所以自己记录一下。
二、操作流程
这里我也是初学者自学,暂时了解到的一些内容,想先让大家清楚一下,首先python中对文件操作的模式中(r、w、a、rb、r+等等),其实默认情况下是无法直接对json文件进行追加的操作,因为json具备有固定的json格式,常用文件操作模式中,追加模式的指针会放置于文件内容的开头或者末尾,也就是会破坏json格式!
所以,很好理解了,所谓的json文件数据的追加,其实最终是通过先加载文件内容,存入给一个对象,然后在对象中追加或更新数据,最后,把这个最新的对象,覆盖掉原有json文件,就是这么个原理。
那么,你的操作就很简单:
1、先判断目录与文件是否存在
初学者对于文件操作很多时候不够仔细,因为我们需要做的是追加数据,但是有时候,文件在实际项目中是可能被清理掉的,所以第一步其实应该是先判断是否存在目录以及文件。
# 切割字符串判断路径是否存在,不存在则创建
data_dir = path.rsplit("/", 1)[0]
if not os.path.isdir(data_dir):
os.mkdir(data_dir)
# 然后判断该目录下文件是否存在,否则创建
f = open(path, "w", encoding="utf-8")
f.close()
2、读取json文件,把所有值取出放到自定义的字典对象中
# 读取json文件的所有内容,如果文件为空则赋予{}json格式
with open(path, "r", encoding="utf-8") as f:
if os.path.isfile(path):
size = os.path.getsize(TestAll.path)
if size == 0:
content = {}
else:
content = json.load(f)
else:
content = {}
f.close()
3、通过python中字典自带的update方法,更新或添加对象
token = {"key1": "value2"}
content.update(token)
update方法会针对字典中具备的元素key执行更新,不具备的元素执行插入!
4、覆盖保存最新的json对象到该文件中
with open(path, "w", encoding="utf-8") as f_new:
json.dump(content, f_new, ensure_ascii=False, indent=4)
f.close()
网上的小伙伴基本没仔细说明这个操作其实是覆盖操作,所以真正的json追加数据其实并不存在,都是通过取出json所有值,然后通过python的字典操作方法update方法,去更新一遍json对象,然后最终用新json对象,覆盖旧的对象写入了文件中。
三、全部代码:
class TestAll:
path = "D:/..路径使用你自己的路径.../all_file/data.json"
def test(self, path):
# 切割字符串判断路径是否存在,不存在则创建
data_dir = path.rsplit("/", 1)[0]
if not os.path.isdir(data_dir):
os.mkdir(data_dir)
# 然后判断该目录下文件是否存在,否则创建
f = open(path, "w", encoding="utf-8")
f.close()
# 读取json文件的所有内容,如果文件为空则赋予{}json格式
with open(path, "r", encoding="utf-8") as f:
if os.path.isfile(path):
size = os.path.getsize(TestAll.path)
if size == 0:
content = {}
else:
content = json.load(f)
else:
content = {}
f.close()
token = {"key1": "value2"}
content.update(token)
with open(path, "w", encoding="utf-8") as f_new:
json.dump(content, f_new, ensure_ascii=False, indent=4)
f.close()
if __name__ == '__main__':
TestAll().test(TestAll.path)
需要注意点:
1、注意路径使用你自己的,通常我们真正的实际项目中,操作的路径建议是绝对路径;
2、上面的代码是可以再细化的,看你个人,比如可以再增加路径转换(windows与苹果系统路径的格式不一致),python中建议使用的路径分隔符是“/”,否则容易出错,转义其实挺麻烦的。
3、可以使用try except去捕获异常进行异常方式的处理。
上面的代码完成结果应该是,如果你的目录不存在,文件不存在,会进行自动创建然后写入,如果存在了,则达成一个追加更新的效果,不会覆盖旧数据,有问题欢迎留言。