Python如何更新JSON文件

Python如何更新JSON文件,python,json,python-3.x,Python,Json,Python 3.x,我有一个JSON文件,看起来像: { "files": [ { "nameandpath": "/home/test/File1.zip", "MD5": "e226664e39dc82749d05d07d6c3078b9", "name": "File1" }, { "nameandpath": "/home/test/File2.zip",

我有一个JSON文件,看起来像:

{
    "files": [
        {
            "nameandpath": "/home/test/File1.zip",
            "MD5": "e226664e39dc82749d05d07d6c3078b9",
            "name": "File1"
        },
        {
            "nameandpath": "/home/test/File2.zip",
            "MD5": "dbb11b2095c952ff1d4b284523d3085f",
            "name": "File2"
        }
    ]
}
当条件为真时,我只希望更新两行nameandpath和MD5。 条件是,如果被测试的文件存在于JSON文件中:我将更新该行,否则我将使用其3个值添加该文件

{
    "files": [
        {
            "nameandpath": "/home/test/File1.zip",
            "MD5": "e226664e39dc82749d05d07d6c3078b9",
            "name": "File1"
        },
        {
            "nameandpath": "/home/test/File2.zip",
            "MD5": "dbb11b2095c952ff1d4b284523d3085f",
            "name": "File2"
        }
        # block added because the file tested wasn't present in json file
        {
            "nameandpath": "/home/test/File3.zip",
            "MD5": "dbb11b2095c952ff1d4b284523d3085f",
            "name": "File3"
        }
    ]
}
我无法更新现有线路 我无法测试添加新行

你能帮帮我吗?
我怎么能做这样的事

到目前为止,我的代码是:

# getting file name
# getting MD5 of the file

jsonfile = "/home/test/filesliste.json"

 with open(jasonfile, "r+") as json_file:
        data = json.load(json_file)
        for tp in data['files']:
            if tp['name'] == name:
                if tp['MD5'] == fileMD5:
                    print("same MD5")
                    # adding this file to json file
                else:
                    print("NOT THE same MD5")
                    # updating the file info into json file

我不清楚你到底在挣扎什么。下面是我将如何构造代码,也许这有助于:

jsonfile = "/home/test/filesliste.json"

# read json file
with open(jsonfile) as f:
    data = json.load(f)

# find index of file or -1 if not found
index = -1
for i, tp in enumerate(data['files']):
    if tp['name'] == name and tp['MD5'] == fileMD5:
        index = i
        break

# update data
# we're lazy and just delete the old file info, then re-add it
if index >= 0:
    del data['files'][index]

tp = {
    "name": ...,
    "nameandpath": ...,
    "MD5": ...,
}
data.append(tp)

# write data back to file
with open(jsonfile) as f:
    # json.dump or something like that
MD5
MD5不应再使用,因为它被认为已损坏。如果可能的话,你应该用类似于ShA2或ShA-3的方法来替换它,但它更安全。

你应该考虑使用另一个散列函数而不是MD5。它被认为是坏的。一个好的替代方案是SHA-2或SHA-3。我使用md5是因为我需要测试zip文件的内容是否不同,如果不同,我将保留zip并更新jason文件,否则我将删除zip文件。“你知道我该怎么做吗?”格奥尔格什利说,它没有坏。对于某些用例(例如密码散列),它不再被认为是足够安全的,但它仍然是一个很好的散列函数,使用它进行数据完整性检查没有什么错。@pole:我不同意。使用md5没有好处。通常情况下,一旦加密函数开始显示裂缝,很快就会出现更好的攻击。知道在什么样的环境下它仍然是安全的是非常重要的。例如,使用普通SHA-3进行密码哈希与使用普通MD5进行密码哈希一样糟糕。这方面的弱点是速度。对于数据完整性,我绝对不推荐MD5。目前还没有实际的预图像攻击,但是攻击者可以在多个文件之间创建冲突,确切地说,数据完整性应该如何保护。@ GoojsCoul你甚至不知道这里是否存在一个实际的攻击向量。并不是每个散列过程都与密码使用有关。对于数据完整性检查来说,速度的“弱点”也是一个非常重要的好处,即能够快速扫描文件或数据。@火山:谢谢您的编辑!但是我确实回滚了它,对我来说,循环变量在循环之后仍然存在是非常奇怪的,所以我更喜欢更显式的版本。Python是动态语言,所以通常-一旦在范围内的任何地方定义了,变量仍然存在。和编译语言一样,And循环不是一个封闭的作用域。到目前为止,我遇到的唯一例外是(双关语是无意的)。。。Python3.5中的异常-一旦您离开except子句,您将丢失截获的except对象。对我来说,你的版本看起来有点不符合Python——可能是我想Python太久了。@volcano:你会怎么写它?我想把
index=-1
放在循环前面,但这也不是很优雅。我遇到过类似的情况,总是有一个默认值,但我还没有找到一个好的解决方案。事实上,由于PEP-8不鼓励在循环外使用未初始化的循环变量,也许在循环前预先设置索引是首选方法。如果是else条款,我会放弃重新分配。当然,这不是什么大问题:)。坦率地说,我以前以反对PEP-8而闻名。。。