#python #mysql
#питон #mysql
Вопрос:
У меня есть простой код, который берет данные из API TMDB и сохраняет их в базе данных, но при этом иногда возникает ошибка ввода.
Traceback (most recent call last): File "fill_data.py", line 63, in lt;modulegt; collect_data(data) File "fill_data.py", line 31, in collect_data "genres": [[genre.get('name') for genre in data.get('genres')]],TypeError: 'NoneType' object is not iterable
Есть ли какой-нибудь способ решить эту проблему?Я использую файл links.csv, предоставленный набором данных MovieLens, вот ссылка https://files.grouplens.org/datasets/movielens/ml-25m.zip
import osimport pandas as pdimport mysql.connectorfrom tqdm import tqdmimport requestslinks_path = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'management/dataset/links.csv')data = pd.read_csv(links_path)mydb = mysql.connector.connect( host="localhost", user="root", password="password", database="database", port=3306)cursor = mydb.cursor()def collect_data(tmdbid_df): for i in tqdm(tmdbid_df['tmdbId']): reponse = requests.get(f'https://api.themoviedb.org/3/movie/{i}?api_key=tmdb_api_key') data = reponse.json() d = {"id": [data.get('id')], "imdb_id": [data.get('imdb_id')], "original_language": [data.get('original_language')], "original_title": [data.get('original_title')], "overview": [data.get('overview')], "genres": [[genre.get('name') for genre in data.get('genres')]], "popularity": [data.get('popularity')], "poster_path": [data.get('poster_path')], "production_company_name": [[company.get('name') for company in data.get('production_companies')]], "production_company_poster": [[company.get('logo_path') for company in data.get( 'production_companies')]], "vote_average": [data.get('vote_average')], "vote_count": [data.get('vote_count')], "revenue": [data.get('revenue')], "release_date": [data.get('release_date')], "adult": [data.get('adult')], "budget": [data.get('budget')], "spoken_languages": [[language.get('name') for language in data.get('spoken_languages')]], "status": [data.get('status')], "runtime": [data.get('runtime')] } sql = "INSERT INTO movies_movie_collected (tmdb_id, imdb_id, " "original_title, original_language, overview, genres, popularity, poster_path, production_company_name," " production_company_poster, vote_average, vote_count, revenue, release_date, adult, budget, " "spoken_languages, status, runtime) " "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)" val = ( d['id'][0], d['imdb_id'][0], str(d['original_title'][0]), str(d['original_language'][0]), str(d['overview'][0]), str(d['genres'][0]), d['popularity'][0], d['poster_path'][0], str(d['production_company_name'][0]), str(d['production_company_poster'][0]), d['vote_average'][0], d['vote_count'][0], d['revenue'][0], d['release_date'][0], d['adult'][0], d['budget'][0], str(d['spoken_languages'][0]), d['status'][0], d['runtime'][0]) cursor.execute(sql, val) mydb.commit()collect_data(data)
Ответ №1:
Похоже, вы пытаетесь перебрать пропущенное значение. Если вам нужно только игнорировать отсутствующие данные и вы хотите избежать множества «если», вы можете использовать .get() значение по умолчанию метода по умолчанию следующим образом:
# instead of"genres": [[genre.get('name') for genre in data.get('genres')]]# use"genres": [[genre.get('name') for genre in data.get('genres', [])]]
Таким образом, когда ваш ключ «жанры» отсутствует в ваших данных, метод get вернет пустой список, который является допустимым для повторения.
Комментарии:
1. Спасибо, теперь все работает нормально. Я застрял на этом на несколько часов, я действительно ценю вашу помощь.