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

时间:2019-02-07 19:56:28

标签: python json

我有一个程序,我在其中读取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"
    }
}

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

2 个答案:

答案 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')

或使您的数据正确。