(最新亲测有效)python中操作json文件追加数据

一、前言

        最近想用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去捕获异常进行异常方式的处理。

上面的代码完成结果应该是,如果你的目录不存在,文件不存在,会进行自动创建然后写入,如果存在了,则达成一个追加更新的效果,不会覆盖旧数据,有问题欢迎留言。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值