【问题标题】:JSON file contain values but still returns nullJSON 文件包含值但仍返回 null
【发布时间】:2020-07-16 10:21:26
【问题描述】:

我正在尝试通过 python 3.7 获取存储在 JSON 文件中的一些值。该文件包含值,但它返回 null。

这是 JSON 文件:

{
   "data_columns":[
      "yearsexperience",
      "milesfrommetropolis",
      "ceo",
      "cfo",
      "cto",
      "janitor",
      "junior",
      "manager",
      "senior",
      "vice president",
      "bachelors",
      "doctoral",
      "high school",
      "masters",
      "others",
      "biology",
      "business",
      "chemistry",
      "computer science",
      "engineering",
      "literature",
      "math",
      "none",
      "physics",
      "automobile",
      "education",
      "finance",
      "health",
      "oil",
      "service",
      "web"
   ]
}

这是我尝试获取值的方式:

import json, pickle

__jobType = None
__data_columns = None
__model = None

def get_jobtpye():
    return __jobType

def load_saved_artifacts():
    print('Loading saved artifacts!')
    global __jobType
    global __data_columns

    with open("./artifacts/columns.json", 'r') as f:
        __data_columns = json.load(f)['data_columns']
        __jobType = __data_columns[2:10]

if __name__ == '__main__':
    load_saved_artifacts()
    get_jobtpye()

当我检查 __jobType 变量是否包含任何东西时,我发现它确实如此。它只是不会返回任何东西。我已经被这个问题困了一个星期了。请帮忙。

【问题讨论】:

  • “它只是不会返回任何东西”是什么意思?当您运行代码时,您究竟期望发生什么,这与实际发生的有什么不同?
  • 全局声明和名称修改是怎么回事?这不是在 python 中进行编码的方法
  • @roganjosh,对不起,我明白了!
  • 我的意思是它应该返回从“ceo”到“副总裁”的值列表(如果您检查 json 文件的索引),但它什么也没显示。程序运行平稳,有任何错误、警告和输出。只需打印字符串“加载工件”即可。

标签: python json api


【解决方案1】:

您的代码运行良好,您只需打印分配给另一个变量的结果:

print(get_jobtpye())
# or
job_type = get_jobtpye()

但是 -

为什么需要这些全局变量?这是绝对没有必要的,而且是非常糟糕的做法。

你可以只从你的函数中返回值:

import json, pickle

def load_saved_artifacts():
    print('Loading saved artifacts!')
    with open("./artifacts/columns.json", 'r') as f:
        data_columns = json.load(f)['data_columns']
        return data_columns[2:10]

if __name__ == '__main__':
    job_type = load_saved_artifacts()

【讨论】:

  • 嗨。我已经尝试过 print(get_jobtype()) 的事情。它在输出中显示“无”。
  • @AunkitChaki:你事先打电话给load_saved_artifacts()了吗?
  • 是的。我做到了。它在代码中。我根本找不到我的代码没有运行的任何原因。
  • 您确定这不是代码另一部分的问题吗?因为您共享的 sn-p 在我的机器上运行良好,我无法重现您的问题。您是否尝试过我建议的方法,没有全局变量。代码更简洁。
【解决方案2】:

您需要在某个变量中捕获 get_jobtpye() 的返回......这将具有值。

if __name__ == '__main__':
    load_saved_artifacts()
    answer = get_jobtpye()

另外,我相信,您实际上并不需要 get_jobtpye() 函数。您的变量 __jobType 已经有了答案

【讨论】:

    【解决方案3】:

    您是否尝试过使用 json.loads() ?它将文件内容作为字符串并且可以被切片。可以参考this的回答。

    【讨论】:

    • 他们已经在文件对象上使用了json.load(),这是正确的方法。无需尝试将文件作为字符串读取然后使用json.loads()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-25
    • 2017-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    相关资源
    最近更新 更多