我有一个程序,我正在读取 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
翻过高山走不出你
TA贡献1875条经验 获得超3个赞
所以... cfg_dsn = con['config']['dsn']
里面的东西被设置为无
你可以安全地把它写成这样
(con or {}).get('config',{}).get('dsn')
或使您的数据正确。
添加回答
举报
0/150
提交
取消