如何过滤掉某些字段没有值的元素

问题描述 投票:0回答:1

我有一个 Python 事件列表。我遇到的问题是很多事件不包含

event_data['pick']['blurb']
。如何创建仅包含具有此数据的事件的过滤列表?

当前代码显示错误

    if event["event"]['pick']['blurb'] in events:
TypeError: 'NoneType' object is not subscriptable
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:
        if event["event"]['pick']['blurb'] in events:
            filtered.append(event)
            # print(filtered)
            
    

    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']])
python
1个回答
0
投票

有一些解决方案(假设您的代码正在执行您希望它执行的操作,这是您需要帮助的唯一错误)。

最简单的方法(但可能不是最好的方法)是使用

try:
except:
忽略给出错误的事件(您可能会假设那些不起作用的事件没有
 ["pick"]["blurb"]
)。这通常仅用作临时修复,但如果没有其他可能出错的地方,
try
except
应该可以正常工作。

#this is the line that gives you the error when you check if the ['event']['pick']['blurb'] is in events, but we put it inside a try and except
try:
    if event['event']['pick']['blurb'] in events:
        filtered.append(event)
except:
    pass #Do nothing when the event doesn't have a ['pick']['blurb'] and causes and error. You can also use "continue" instead of "pass", which just moves on to the next loop

下一个最简单的方法是实施条件检查,看看它是否不是 None ,因为正如你的错误所说,

NoneType object is not subscriptable
,在这种情况下,这意味着你正在寻找不存在的东西。我们通过使用
.get()
来做到这一点,它应该返回该值,除非它不存在,在这种情况下它应该返回
None

#Same place as last example but we do an additional conditional check
if event.get('event') != None and event['event'].get('pick') != None and event['event']['pick'].get('blurb') != None:
    filtered.append(event)
© www.soinside.com 2019 - 2024. All rights reserved.