我有一个程序,我在其中读取JSON文件,并根据文件中指定的参数执行一些SQL。
irb(main):009:0> multi_array = [%w[Jack Fred Jane], %w[Paul Matthew Richard], %w[Jack Bart Hector], %w[John Veronica Nic ole], %w[Marcella Vianka Richard]]
=> [["Jack", "Fred", "Jane"], ["Paul", "Matthew", "Richard"], ["Jack", "Bart", "Hector"], ["John", "Veronica", "Nicole"], ["Marcella", "Vianka", "Richard"]]
irb(main):010:0> multi_array.each_with_object([]) { |a, result| result << a unless a.any? { |b| result.flatten.include?(b) } }
=> [["Jack", "Fred", "Jane"], ["Paul", "Matthew", "Richard"], ["John", "Veronica", "Nicole"]]
方法首先将json文件加载到Python对象(此处未显示,但可以正常工作) 问题出在这里的代码片段:
load_json_file()
init _ 方法首先加载JSON文件,然后将其存储在“ con”中。我读到一个错误:
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
JSON文件如下所示:
cfg_dsn = con['config']['dsn']
E TypeError: 'NoneType' object is not subscriptable
load_json_file()的定义如下:
{
"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"
}
}
我为什么会看到错误的任何想法?
答案 0 :(得分:1)
问题是您正在检查配置文件是否存在,然后读取它。
如果不是,则您的函数返回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
答案 1 :(得分:0)
所以... cfg_dsn = con['config']['dsn']
其中的某项设置为“无”
您可以放心地写成这样
(con or {}).get('config',{}).get('dsn')
或使您的数据正确。