首页 > 解决方案 > 当我使用 python 从 json 中的数组中删除一个对象时,它会破坏我的 json 文件。我该如何解决?

问题描述

当我使用 python 从 json 中的数组中删除一个对象时,它会破坏我的 json 文件。例如这里是我的蟒蛇:

srs = server["purchaseableRoles"]
                        if srs == []:
                            await ctx.send("Your server has no purchaseable roles at the moment, you cant remove one.")
                        else:
                            for i in srs:
                                splitsrs = i.split("|")
                                if int(splitsrs[0]) == role.id:
                                    print(str(i))
                                    srs.remove(str(i))
                                    print(srs)
                                    f.seek(0)
                                    json.dump(serversjson,f,sort_keys=True,indent=4)
                                    await ctx.send("removed the role from the role shop!")

(请忽略 discord.py 的东西,它在一个不和谐的机器人中。也忽略奇怪的缩进,我不知道为什么它会这样粘贴)该代码几乎是从 json 文件中的数组中删除一个对象,并更新它。除了当我这样做时,这是我的 json:

{
    "servers": [
        {
            "id": 1234,
            "purchaseableRoles": [
                "1234|5678"
            ]
        },
        {
            "id": 813070255127396352,
            "purchaseableRoles": []
        }
    ]
}071595911774238|5"
            ]
        }
    ]
}

一切都搞砸了。这是我在搞砸之前的 json:

{
    "servers": [
        {
            "id": 1234,
            "purchaseableRoles": [
                "1234|5678"
            ]
        },
        {
            "id": 813070255127396352,
            "purchaseableRoles": [
                "813071595911774238|5"
            ]
        }
    ]
}

有没有办法防止这种情况?如果您提供帮助,请提前致谢。

标签: pythonarraysjsonlist

解决方案


您将文件光标移动到文件的开头,并用 JSON 字符串中的字节覆盖文件中的字节。

但是你删除了一些东西,所以覆盖文件的字符串比文件中的字符串短。

所以在文件的末尾,一些旧字符串仍然存在。

有一个方法file_obj.truncate()。但显然,Python3 中几乎没有关于它的文档。像这样的东西:

f.seek(0)
f.truncate()

推荐阅读