python-将.json加载到字典中失败

时间:2019-03-25 10:56:01

标签: python json file dictionary

我正在尝试将.json文件中的所有内容加载到python中的字典中。

任何人都可以向我解释以下内容为何无效的原因吗?

my_dict = {}

def change_dict(str_file_path, dict_param):
  with open(str_file_path) as opened_file:
    dict_param = json.load(opened_file)
  opened_file.close

change_dict(my_file_path, my_dict)

我用于文件的路径是正确的,并且当我不使用字典参数而是直接使用my_dict时,上述方法有效(但这不是我想要的)。

我一直在使用Pycharm,视觉辅助工具向我“显示”它将字典参数视为以后不再使用的东西,这也没有任何意义。

pycharm

打印my_dict显示{}。我想如果我尝试将字典参数作为值返回到我的全局字典中,它将起作用(但是现在我不想这样做),但是我想知道为什么上面的方法不起作用。

有什么想法吗?

谢谢

3 个答案:

答案 0 :(得分:3)

考虑您的代码:

my_dict = {}

def change_dict(str_file_path, dict_param):
  with open(str_file_path) as opened_file:
    dict_param = json.load(opened_file)  # **
  opened_file.close()

change_dict(my_file_path, my_dict)  # *

在(*),您正在传递对my_dict的引用。此“引用”只是一个存储my_dict地址的变量(如果您知道C / C ++,这就像一个指针)。我们将其称为“地址变量”A。请注意,A指向my_dict而不是对象本身的内存块。现在,在(**),将此“地址变量” /指针分配给json.load(...)返回的另一个内存块。它所做的就是将另一个地址写入此“地址变量” /指针,而保留原始的内存块(my_dict)不变。

但是,如果您不更改指针的值,而是调用一个函数来修改my_dict,例如update(),则可以在函数内部修改my_dict。例如:

import json

my_dict = {}


def change_dict(str_file_path, dict_param):
    with open(str_file_path) as opened_file:
        tmp = json.load(opened_file)
        dict_param.update(tmp)

change_dict('test.json', my_dict)
print(my_dict)

我的test.json文件所在的位置:

{
  "apple": "banana",
  "pineapple": "papaya"
}

答案 1 :(得分:1)

看来您什么也没返回。

尝试:

def change_dict(str_file_path):
  with open(str_file_path) as opened_file:
    dict_param = json.load(opened_file)
  return dict_param

my_dict = change_dict(my_file_path)

如果您坚持使用全局变量(在这种情况下是不好的做法),可以尝试:

dict_param = {}
def change_dict(str_file_path):
  global dict_param
  with open(str_file_path) as opened_file:
    dict_param = json.load(opened_file)

change_dict(my_file_path)

请注意,如果不返回值,则函数会自动返回None

这是一个使用全局变量的简单示例:

my_dict = {}

def something(key, value):
    global my_dict
    my_dict[key] = value

def something_else():
    global my_dict
    my_dict = {'c': 'd'}

def non_global():
    my_dict = {'e': 'f'}

something('a', 'b')
print(my_dict)  ## outputs: {'a': 'b'}
something_else()
print(my_dict)  ## outputs: {'c': 'd'}
non_global()
print(my_dict)  ## outputs: {'c': 'd'}

通常,函数返回答案要比将答案存储在超出范围的全局变量中更好。

答案 2 :(得分:1)

import json

def load_data(path):
   with open(path,'r') as f:
      return json.load(f)