【问题标题】:Can't change value into json无法将值更改为 json
【发布时间】:2014-08-08 21:54:46
【问题描述】:

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

{
    "users": [
        {
            "last result": 15,
            "login": "admin",
            "id": 1,
            "password": "1"
        },
        {
            "last result": 2,
            "login": "user",
            "id": 2,
            "password": "1"
        }
    ]
}

例如,我需要从“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.

如果我只取“最后一个结果”的值

def get_last_result(login):
    for user in load_data_from_json("auth.json")["users"]:
        if user["login"] == login:
            return user["last result"]
    raise Exception("User '{}' not found.".format(login))

一切正常。我的错在哪里?

附:我正在使用 Python 3.4

P.S.S 修复我的错误信息。

【问题讨论】:

  • 我在您的代码中看不到任何print(user["admin"]),更重要的是我在您的用户字典中看不到任何"admin" 键,这可能是KeyError 的来源。
  • 用户没有'admin'键,他们有'login'键。当您打印 user['admin'] 时,您会生成一个密钥错误。
  • 对不起,我发布了不正确的错误信息,现在我已经修复了。
  • 您的 get 方法在找到用户时返回。 set 方法不会,因此它总是会完成 for 循环然后引发异常。

标签: python json python-3.x


【解决方案1】:

回答您对异常的关注:

正如@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))

在更一般的情况下,不只是在函数内部,您可以使用for ... else

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_last_result 函数的外部范围内没有任何影响,最值得注意的是它不会更新加载的 json 文件。

为此,您需要Write JSON data to file in python

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-25
    • 2012-07-11
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 2016-04-08
    • 2012-10-23
    • 1970-01-01
    相关资源
    最近更新 更多