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

我有一个程序,我正在读取 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 execution

def 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 subscriptable

JSON 文件如下所示:


{

    "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

任何想法为什么我看到错误?


缥缈止盈
浏览 328回答 2
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

翻过高山走不出你

所以... cfg_dsn = con['config']['dsn']里面的东西被设置为无你可以安全地把它写成这样(con or {}).get('config',{}).get('dsn')或使您的数据正确。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python