Python中如何过滤出含有效event_data['pick']['blurb']的事件列表
解决Python事件列表过滤时的NoneType索引错误
错误原因分析
原代码存在两个核心问题:
- 未做空值层级校验:当
event["event"]或event["event"]['pick']为None时,直接链式取['blurb']会触发TypeError——None对象不支持下标访问。 - 过滤逻辑完全错误:
event["event"]['pick']['blurb'] in events的判断毫无意义,blurb是字符串类型,events是事件对象列表,两者不可能匹配,这行代码根本起不到过滤有效数据的作用。
修正后的代码
with open(output_file, "w", newline="", encoding="utf-8") as file: writer = csv.writer(file) writer.writerow(["Event name", "Date", "Start Time", "End Time", "Artists", "Images", "Image", "Blurb", "Venue"]) filtered = [] for event in events: # 逐层校验每个层级的有效性,避免空值报错 event_data = event.get("event") if event_data: pick_data = event_data.get("pick") if pick_data: blurb = pick_data.get("blurb") # 仅保留blurb非空且不为空白字符串的事件 if blurb and blurb.strip(): filtered.append(event) for event in filtered: event_data = event["event"] writer.writerow([event_data['title'], event_data['date'], event_data['startTime'], event_data['endTime'], ', '.join([artist['name'] for artist in event_data['artists']]), ', '.join([images['filename'] for images in event_data['images']]), event_data['images'][0]['filename'], event_data['pick']['blurb'], event_data['venue']['name']])
关键修改说明
- 安全取值:使用
dict.get()方法代替直接索引,当键不存在时返回None,避免触发下标访问错误。 - 层级校验:依次检查
event["event"]、event["event"]["pick"]是否存在,最后校验blurb是否为非空有效字符串。 - 修正过滤逻辑:移除了错误的
in events判断,替换为实际的字段有效性校验,确保只有包含有效blurb的事件才会被保留。
内容的提问来源于stack exchange,提问作者user237462
相关产品推荐
相关产品推荐

