【问题标题】:format string via unpacking dict when few keys are missing当缺少几个键时,通过解包 dict 格式化字符串
【发布时间】:2017-02-01 05:28:05
【问题描述】:

我正在尝试执行显示一些 IMDB 电影评分的代码:

import json
import sys

import imdb
import sendgrid

NOTIFY_ABOVE_RATING = 7.5

SENDGRID_API_KEY = "API KEY GOES HERE"


def run_checker(scraped_movies):
    imdb_conn = imdb.IMDb()
    good_movies = []
    for scraped_movie in scraped_movies:
        imdb_movie = get_imdb_movie(imdb_conn, scraped_movie['name'])
        if imdb_movie['rating'] > NOTIFY_ABOVE_RATING:
            good_movies.append(imdb_movie)
    if good_movies:
        send_email(good_movies)


def get_imdb_movie(imdb_conn, movie_name):
    results = imdb_conn.search_movie(movie_name)
    movie = results[0]
    imdb_conn.update(movie)
    print("{title} => {rating}".format(**movie))
    return movie


def send_email(movies):
    sendgrid_client = sendgrid.SendGridClient(SENDGRID_API_KEY)
    message = sendgrid.Mail()
    message.add_to("trevor@example.com")
    message.set_from("no-reply@example.com")
    message.set_subject("Highly rated movies of the day")
    body = "High rated today:<br><br>"
    for movie in movies:
        body += "{title} => {rating}".format(**movie)
    message.set_html(body)
    sendgrid_client.send(message)
    print("Sent email with {} movie(s).".format(len(movies)))


if __name__ == '__main__':
    movies_json_file = sys.argv[1]
    with open(movies_json_file) as scraped_movies_file:
        movies = json.loads(scraped_movies_file.read())
    run_checker(movies)

但它返回给我这个错误:

C:\Python27\Scripts>python check_imdb.py movies.json
T2 Trainspotting => 8.1
Sing => 7.3
Traceback (most recent call last):
  File "check_imdb.py", line 49, in <module>
    run_checker(movies)
  File "check_imdb.py", line 16, in run_checker
    imdb_movie = get_imdb_movie(imdb_conn, scraped_movie['name'])
  File "check_imdb.py", line 27, in get_imdb_movie
    print("{title} => {rating}".format(**movie))
KeyError: 'rating'

发生这种情况是因为它试图打印还没有分级的电影。 我多次尝试 if/else 来修复它,但没有成功。

【问题讨论】:

    标签: python api if-statement scrapy imdbpy


    【解决方案1】:

    问题是因为您的 movie 字典没有 rating key 。为了解决这个问题,您可以使用dict.setdefault 将评级的默认值设置为“未知”或“0”(根据适合您的情况)

    # set value of 'rating' as 'unknown' if 'rating' key is not present
    movie.setdefault('rating', 'unknown')  
    
    # then do format as:
    "{title} => {rating}".format(**movie)
    

    欲了解更多信息,请查看:Use cases for the setdefault dict method

    【讨论】:

    • 我做到了。但是现在,当没有 Title 时,它​​显示 movie = results[0] IndexError: list index out of range Tryed movie.setdefault('title', 'unknown') 但没有任何内容。
    • @Lestat 我相信您知道 SO 不是教程服务。您将不得不自己调试问题。基于这个新错误,我(或其他任何人)可以判断的最大值是 results 此处为空列表,您正在尝试访问第 0 个索引处的元素。因此,您在错误中看到的消息
    猜你喜欢
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-26
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多