Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Can';t将值转换为json_Python_Json_Python 3.x - Fatal编程技术网

Python Can';t将值转换为json

Python Can';t将值转换为json,python,json,python-3.x,Python,Json,Python 3.x,我正在编写一个简单的应用程序,其中包含用于存储一些用户信息的json文件 { "users": [ { "last result": 15, "login": "admin", "id": 1, "password": "1" }, { "last result": 2, "login": "use

我正在编写一个简单的应用程序,其中包含用于存储一些用户信息的json文件

{
    "users": [
        {
            "last result": 15,
            "login": "admin",
            "id": 1,
            "password": "1"
        },
        {
            "last result": 2,
            "login": "user",
            "id": 2,
            "password": "1"
        }
    ]
}
例如,我需要将值“last result”从“user”=admin更改为“last result” 我有从json获取数据的方法:

def load_data_from_json(test_file_name):
    with open(test_file_name, encoding="utf-8") as data_file:
        return json.load(data_file)
test_file_name-json的名称(在我的代码中是“auth.json”)

然后我尝试设置新值:

def set_last_result(login, new_result):
    for user in load_data_from_json("auth.json")["users"]:
        if user["login"] == login:
            user["last result"] = new_result
    raise Exception("User '{}' not found.".format(login))
但我有一个错误:

  File "/Users/future/PycharmProjects/module_for_test/user.py", line 53, in set_last_result
    raise Exception("User '{}' not found.".format(login))
Exception: User 'admin' not found.
如果我只取“最后结果”值

一切顺利。我的错在哪里

另外,我正在使用Python 3.4


请注意修复我的错误消息。

要回答您对异常的关注:

正如@Dunes所说,如果您不想引发异常,则不能允许for循环完成,因此在您的情况下,您可以返回:

def set_last_result(login, new_result):
    for user in load_data_from_json("auth.json")["users"]:
        if user["login"] == login:
            user["last result"] = new_result
            return
    raise Exception("User '{}' not found.".format(login))
在更一般的情况下,不只是在函数内部,您可以使用
来。。。否则

def set_last_result(login, new_result):
    for user in load_data_from_json("auth.json")["users"]:
        if user["login"] == login:
            user["last result"] = new_result
            break
    else:  # will execute only if `for` loops through all values without break
        raise Exception("User '{}' not found.".format(login))

但还有一个不同的问题:

您正在更新一个局部变量
user
,该变量对
set\u last\u result
函数的外部范围没有任何影响,最明显的是它不会更新加载的json文件


要做到这一点,您需要。

我在您的代码中没有看到任何
打印(用户[“admin”])
,更重要的是,我在您的用户字典中没有看到任何
“admin”
键,这可能就是
键错误的来源。用户没有“admin”键,他们有“login”键。当您打印
user['admin']
时,您会生成一个键错误。很抱歉,我发布了错误消息,现在我已经修复了它。get方法在找到用户时返回。set方法不会,因此它将始终完成for循环,然后引发异常。的可能重复项
def set_last_result(login, new_result):
    for user in load_data_from_json("auth.json")["users"]:
        if user["login"] == login:
            user["last result"] = new_result
            break
    else:  # will execute only if `for` loops through all values without break
        raise Exception("User '{}' not found.".format(login))