【发布时间】:2020-10-13 06:33:04
【问题描述】:
更新:确定迭代发生在错误的变量上
我正在编写一个脚本来从 json 数据中解析“主机名”对象,并且使用列表推导仅“有时”有效。当我对 Python 比较陌生时,我已经看到过这种行为,但是现在我再次看到它,这没有任何意义;列表推导应该起作用或者不应该起作用,没有歧义。
具体来说,变量 parsed_data2_hostnames 的列表解析不起作用,它是变量 parsed_data_hostnames 的正常工作列表解析的精确副本。首先,您可以看到变量 parsed_data_hostnames 的列表推导工作得非常好,并且我能够得到响应,因此这告诉我列表推导的结构是完整的。其次,如果我将失败的列表理解转换为“正常”的 for 循环,那么逻辑就起作用了!这进一步证明了列表理解是完整的,但由于某种原因它仍然不起作用。
这行不通……
parsed_data_hostnames = [i['hostname'] for i in parsed_data['resources']]
# parsed_data2_hostnames = []
# for i in parsed_data2_hostnames:
# parsed_data2_hostnames = i['hostname']
parsed_data2_hostnames = [i['hostname'] for i in parsed_data2['resources']]
print(len(parsed_data_hostnames), type(parsed_data_hostnames))
print(len(parsed_data2_hostnames), type(parsed_data2_hostnames))
输出:
Traceback(最近一次调用最后一次): 文件“/Users/jlobianc/PycharmProjects/get_cs_managed_nodes/venv/json_training.py”,第 146 行,在 parsed_data2_hostnames = [i['hostname'] for i in parsed_data2['resources']] 文件“/Users/jlobianc/PycharmProjects/get_cs_managed_nodes/venv/json_training.py”,第 146 行,在 parsed_data2_hostnames = [i['hostname'] for i in parsed_data2['resources']] KeyError: '主机名'
但这确实...
parsed_data_hostnames = [i['hostname'] for i in parsed_data['resources']]
parsed_data2_hostnames = []
for i in parsed_data2_hostnames:
parsed_data2_hostnames = i['hostname']
# parsed_data2_hostnames = [i['hostname'] for i in parsed_data2['resources']]
print(len(parsed_data_hostnames), type(parsed_data_hostnames))
print(len(parsed_data2_hostnames), type(parsed_data2_hostnames))
输出:
5000 0
编辑:验证主机名密钥确实存在于上述 json 数据中(基于 unix 的操作系统)...
with open('/Users/[name_omitted]/cs_results_parsed_2.json', 'w+', encoding='utf-8') as outf:
json.dump(parsed_data2, outf, ensure_ascii=False, indent=4)
关闭我的 MacOS cmd 行...
[hostname_omitted]:venv [name_omitted]$ jq '.resources[].hostname' ~/cs_results_parsed_2.json | wc -l
2243
(venv) [name_omitted]:venv [name_omitted]$ grep hostname ~/cs_results_parsed_2.json | more
"hostname": "SIN-L-1007198",
[省略了 grep 输出的其余部分]
【问题讨论】:
-
在您的代码的一个版本中,您正在循环使用
parsed_data2。另一方面,您在parsed_data2_hostnames上循环,这是您刚刚创建的空列表。 -
我不敢相信我错过了。我现在遇到同样的错误。很乐意将您标记为正确答案。
标签: python python-3.x list-comprehension