为了账号安全,请及时绑定邮箱和手机立即绑定

Python 错误:将 JSON 加载到变量中时,Nonetype 对象不可下标

Python 错误:将 JSON 加载到变量中时,Nonetype 对象不可下标

缥缈止盈 2021-11-02 09:58:18
我有一个程序,我正在读取 JSON 文件,并根据文件中指定的参数执行一些 SQL。这load_json_file()方法首先将 json 文件加载到 Python 对象(此处未看到但工作正常)问题在于此处的代码片段:class TestAutomation:def __init__(self):    self.load_json_file()# connect to Teradata and load session to be used for executiondef connection(self):    con = self.load_json_file()    cfg_dsn = con['config']['dsn']    cfg_usr = con['config']['username']    cfg_pwd = con['config']['password']    udaExec = teradata.UdaExec(appName="DataAnalysis", version="1.0", logConsole=False)    session = udaExec.connect(method="odbc", dsn=cfg_dsn, username=cfg_usr, password=cfg_pwd)    return session该init_方法首先加载JSON文件,然后我存储在“CON”。虽然我收到一个错误,但内容如下:cfg_dsn = con['config']['dsn']E   TypeError: 'NoneType' object is not subscriptableJSON 文件如下所示:{    "config":{                                "src":"C:/Dev\\path",                                              "dsn":"XYZ",                                "sheet_name":"test",                                "out_file_prefix":"C:/Dev\\test\\OutputFile_",                                                       "password":"pw123",                                "username":"user123",                                "start_table":"11",                                "end_table":"26",                                "skip_table":"1,13,17",                                "spot_check_table":"77"    }}load_json_file() 定义如下:def load_json_file(self):    if os.path.isfile(os.path.dirname(os.path.realpath(sys.argv[0])) + '\dwconfig.json'):        with open('dwconfig.json') as json_data_file:            cfg_data = json.load(json_data_file)        return cfg_data任何想法为什么我看到错误?
查看完整描述

2 回答

?
森林海

TA贡献2011条经验 获得超2个赞

问题是您正在检查配置文件是否存在,然后读取它。


如果没有,您的函数将返回None. 这在很多方面都是错误的,因为os.path.realpath(sys.argv[0])可能返回不正确的值,例如,如果命令仅使用基本名称运行,通过系统路径找到($0在 bash 中返回完整路径,但不在 python 或 C 中)。


这不是您获取当前命令目录的方式。


(加上之后你要做的with open('dwconfig.json') as json_data_file:就是现在的文件名,没有完整路径,又错了)


我会跳过这个测试,但正确计算配置文件路径。如果它不存在,就让程序崩溃,而不是返回None稍后会崩溃的程序。


def load_json_file(self):

    with open(os.path.join(os.path.dirname(__file__),'dwconfig.json')) as json_data_file:

        cfg_data = json.load(json_data_file)

    return cfg_data


查看完整回答
反对 回复 2021-11-02
?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

所以... cfg_dsn = con['config']['dsn']

里面的东西被设置为无

你可以安全地把它写成这样

(con or {}).get('config',{}).get('dsn')

或使您的数据正确。


查看完整回答
反对 回复 2021-11-02
  • 2 回答
  • 0 关注
  • 326 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信