>source

json 데이터에서 "hostname"객체를 구문 분석하는 스크립트를 작성 중이며 목록 이해를 사용하면 "때로는"만 작동합니다. 필자는 파이썬을 처음 접했을 때이 동작을 보았지만 이제는 다시 이해하기 때문에 이해가되지 않습니다. 모호함없이 목록 이해력이 작동하거나 작동하지 않아야합니다.

특히 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))

출력 :

추적 (최근 통화 마지막) :   146 행의 "/Users/jlobianc/PycharmProjects/get_cs_managed_nodes/venv/json_training.py"파일     parsed_data2_hostnames = [parsed_data2 [ 'resources']]의 i에 대한 [i [ 'hostname']]   146 행의 "/Users/jlobianc/PycharmProjects/get_cs_managed_nodes/venv/json_training.py"파일     parsed_data2_hostnames = [parsed_data2 [ 'resources']]의 i에 대한 [i [ 'hostname']] 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 기반 OS에서)에 실제로 존재하는지 확인 ...

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",

[그렙 출력의 나머지 부분을 생략]

  • 답변 # 1

    Blckknght가 언급했듯이 두 번째 "작동"예에서 parsed_data2 대신 parsed_data2_hostnames를 잘못 반복했습니다. 이 실수를 수정하면 동일한 키 오류 문제가 발생한다는 것을 확인했습니다.

    json 데이터를 파싱하는 문제는 완전히 별개의 문제이므로이를 닫을 것이다. 감사합니다. Blckknght.

  • 이전 ruby on rails - csv - : malformedcsverror : 줄 바꿈은 이어야합니다
  • 다음 견고성에 중첩 배열을 반환하는 방법