Это задание, которое я должен сделать для онлайн-курса.Мы изучаем моделирование данных и реляционные базы данных.Для этого задания мы должны взять входные данные из файла списка воспроизведения iTunes xml и поместить их в базу данных.Вот код:
import xml.etree.ElementTree as ET
import sqlite3
conn = sqlite3.connect('trackdb14.sqlite')
cur = conn.cursor()
# Make some fresh tables using executescript()
cur.executescript('''
DROP TABLE IF EXISTS Artist;
DROP TABLE IF EXISTS Album;
DROP TABLE IF EXISTS Track;
DROP TABLE IF EXISTS Genre;
CREATE TABLE Artist (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT UNIQUE
);
CREATE TABLE Album (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
artist_id INTEGER,
title TEXT UNIQUE
);
CREATE TABLE Track (
id INTEGER NOT NULL PRIMARY KEY
AUTOINCREMENT UNIQUE,
title TEXT UNIQUE,
album_id INTEGER,
len INTEGER, rating INTEGER, count INTEGER,
genre_id INTEGER
);
CREATE TABLE Genre (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT ,
genre_id INTEGER
);
''')
fname =('C:/Users/Jeremiah/Desktop/Python/code3/tracks/Library.xml')
#if ( len(fname) < 1 ) : fname = 'Library.xml'
# <key>Track ID</key><integer>369</integer>
# <key>Name</key><string>Another One Bites The Dust</string>
# <key>Artist</key><string>Queen</string>
def lookup(d, key):
found = False
for child in d:
if found : return child.text
if child.tag == 'key' and child.text == key :
found = True
return None
stuff = ET.parse(fname)
all = stuff.findall('dict/dict/dict')
print('Dict count:', len(all))
for entry in all:
if ( lookup(entry, 'Track ID') is None ) : continue
name = lookup(entry, 'Name')
artist = lookup(entry, 'Artist')
album = lookup(entry, 'Album')
count = lookup(entry, 'Play Count')
rating = lookup(entry, 'Rating')
length = lookup(entry, 'Total Time')
genre = lookup(entry, 'Genre')
if name is None or artist is None or album is None :
continue
#print(name, artist, album, count, rating, length,genre)
cur.execute('''INSERT OR IGNORE INTO Artist (name)
VALUES ( ? )''', ( artist, ) )
cur.execute('SELECT id FROM Artist WHERE name = ? ', (artist, ))
artist_id = cur.fetchone()[0]
cur.execute('''INSERT OR IGNORE INTO Album (title, artist_id)
VALUES ( ?, ? )''', ( album, artist_id ) )
cur.execute('SELECT id FROM Album WHERE title = ? ', (album, ))
album_id = cur.fetchone()[0]
cur.execute('''INSERT INTO Genre (name)
VALUES ( ? )''',(genre, ) )
cur.execute('SELECT id FROM Genre WHERE name = ? ', (genre, ))
if (cur.fetchone()) is None or (cur.fetchone() is 'None'):
print('Here')
else:
print(cur.fetchone())
genre_id = None
#print (name)
#print(artist)
#print(genre_id)
if genre_id is not None:
cur.execute('''INSERT OR IGNORE INTO Genre (genre_id)
VALUES (?)''',(genre_id, ))
cur.execute('''INSERT OR REPLACE INTO Track
(title, album_id, len, rating, count)
VALUES ( ?, ?, ?, ?, ? )''',
( name, album_id, length, rating, count ) )
genre_id = None
conn.commit()
continue
else:
cur.execute('''INSERT OR REPLACE INTO Genre (genre_id)
VALUES (?)''',(genre, ))
cur.execute('''INSERT OR REPLACE INTO Track
(title, album_id, len, rating, count)
VALUES ( ?, ?, ?, ?, ? )''',
( name, album_id, length, rating, count ) )
#genre_id = None
conn.commit()
print('done')
Мне нужно положить genre_id
в таблицу треков.Но когда я запускаю код, включающий genre_id = cur.fetchone()[0]
, я получаю ошибку: NoneType is not subscriptable
.Итак, я попытался распечатать cur.fetchone()
, чтобы увидеть, какие значения вернули None
.Я использовал is not None
, чтобы попытаться найти значения cur.fetchone()
, которые возвращают None
, но когда я распечатываю каждое значение cur.fetchone()
, оно все равно иногда печатает None
.
Как можноЯ отсеял случаи, когда cur.fetchone()
это None
?
Я застрял на несколько дней.
Заранее спасибо за помощь !!!
Редактировать:
import xml.etree.ElementTree as ET
import sqlite3
conn = sqlite3.connect('trackdb14.sqlite')
cur = conn.cursor()
# Make some fresh tables using executescript()
cur.executescript('''
DROP TABLE IF EXISTS Artist;
DROP TABLE IF EXISTS Album;
DROP TABLE IF EXISTS Track;
DROP TABLE IF EXISTS Genre;
CREATE TABLE Artist (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT UNIQUE
);
CREATE TABLE Album (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
artist_id INTEGER,
title TEXT UNIQUE
);
CREATE TABLE Track (
id INTEGER NOT NULL PRIMARY KEY
AUTOINCREMENT UNIQUE,
title TEXT UNIQUE,
album_id INTEGER,
len INTEGER, rating INTEGER, count INTEGER,
genre_id INTEGER
);
CREATE TABLE Genre (
id INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT UNIQUE,
name TEXT ,
genre_id INTEGER
);
''')
fname =('C:/Users/Jeremiah/Desktop/Python/code3/tracks/Library.xml')
#if ( len(fname) < 1 ) : fname = 'Library.xml'
# <key>Track ID</key><integer>369</integer>
# <key>Name</key><string>Another One Bites The Dust</string>
# <key>Artist</key><string>Queen</string>
def lookup(d, key):
found = False
for child in d:
if found : return child.text
if child.tag == 'key' and child.text == key :
found = True
return None
stuff = ET.parse(fname)
all = stuff.findall('dict/dict/dict')
print('Dict count:', len(all))
for entry in all:
if ( lookup(entry, 'Track ID') is None ) : continue
name = lookup(entry, 'Name')
artist = lookup(entry, 'Artist')
album = lookup(entry, 'Album')
count = lookup(entry, 'Play Count')
rating = lookup(entry, 'Rating')
length = lookup(entry, 'Total Time')
genre = lookup(entry, 'Genre')
if name is None or artist is None or album is None :
continue
#print(name, artist, album, count, rating, length,genre)
#cur.execute('SELECT id from ')
cur.execute('''INSERT OR IGNORE INTO Artist (name)
VALUES ( ? )''', ( artist, ) )
cur.execute('SELECT id FROM Artist WHERE name = ? ', (artist, ))
artist_id = cur.fetchone()[0]
cur.execute('''INSERT OR IGNORE INTO Album (title, artist_id)
VALUES ( ?, ? )''', ( album, artist_id ) )
cur.execute('SELECT id FROM Album WHERE title = ? ', (album, ))
album_id = cur.fetchone()[0]
cur.execute('''INSERT INTO Genre (name)
VALUES ( ? )''',(genre, ) )
cur.execute('SELECT id FROM Genre WHERE name = ? ', (genre, ))
genre_id = cur.fetchone()[0]
print (name)
print(artist)
print(genre_id)
if genre_id is not None:
cur.execute('''INSERT OR IGNORE INTO Genre (genre_id)
VALUES (?)''',(genre_id, ))
cur.execute('''INSERT OR REPLACE INTO Track
(title, album_id, len, rating, count)
VALUES ( ?, ?, ?, ?, ? )''',
( name, album_id, length, rating, count ) )
genre_id = None
conn.commit()
continue
else:
cur.execute('''INSERT OR REPLACE INTO Genre (genre_id)
VALUES (?)''',(genre, ))
cur.execute('''INSERT OR REPLACE INTO Track
(title, album_id, len, rating, count)
VALUES ( ?, ?, ?, ?, ? )''',
( name, album_id, length, rating, count ) )
#genre_id = None
conn.commit()
print('done')
[Команда: python -u C: \ Users \ Jeremiah \ Desktop \ Python \ code3 \ track \ track.py] Количество Dict: 404 Еще один кусает Пыльную Королеву 1 Asche Zu AscheRammstein 3 Школы Красоты Выпускные Разные 5 Черная собака под руководством Zeppelin 1 Верните мальчиков домой Pink Floyd 1 Круги Bryan Lee 11 Удобно онемевший Pink Floyd 1 Сумасшедшая маленькая вещь под названием Love Queen 1 Электрические похороны Black Sabbath 17 Толстая дама для девочек Queen 1 Для тех, кто собираетсяРок (мы приветствуем вас) AC / DC 1 Четыре палки Led Zeppelin 1 Furious Angels Rob Dougan 5 Gelle Bryan Lee 27 Поездка в Калифорнию Led Zeppelin 1 Смазка Разное 5 Hand of Doom Black Sabbath 17 Hells You AC / DC 1 Hey You Pink Floyd 1Я беспокоюсь, Брайяn Lee 27 Iron Man Black Sabbath 17 Есть там кто-нибудь?Пинк Флойд 1 Это был очень хороший год Фрэнк Синатра 45 Это твое движение Брайан Ли 27 Джек Стриптизерши / Сапоги фей Черная суббота 17 Killer Queen Queen 1 Laichzeit Rammstein 3 Подведи меня легко Брайан Ли 27 Туманная гора Хоп Led Zeppelin 1 Нет НизкаяДаун Брайан Ли 27 Теперь ты ушел из Америки 45 За пределами стены Пинк Флойд 1 Параноидальная черная суббота 17 Планета Караван Черная суббота 17 Симпатичная Джини Брайан Ли 27 Раммштайн Раммштайн 3 Крысиный салат Черная суббота 17 Рок-н-ролл Led Zeppelin 1 Поездка по пустыне Америки 45Сэнди Разное 5 Встряхни свой фундамент AC / DC 1 Сестра Золотые Волосы Америка 45 Кто-то, чтобы любить Королеву 1 Лестница на небеса Светодиод Цеппелин 1 Незнакомцы ночью Фрэнк Синатра 45 Летние ночи Разные 5 Летний ветер Фрэнк Синатра 45 Thats Life Фрэнк Синатра 45 Битва приEvermore Led Zeppelin 1 Блюз "Есть" Брайан Ли 27 Вот он, Брайан Ли 27 Думаю, Брайан Ли 27 Этот город Фрэнк Синатра 45 Железный человек Америка 45 Трек 01 Билли Цена 27 Трек 02 Билли Цена 27 Трек 03 Билли Прик27 Мессин с малышом The Canets Blues Band 27 Трек 04 Билли Прайс 27 Штормовый понедельник Canets Blues Band 27 Трек 05 Билли Прайс 27 Ожидание на льду Брайан Ли 27 War Pigs / Luke's Wall Black Sabbath 17 Мы - королева чемпионов 1 Мы будемRock You Queen 1 Когда кто-то тебя любит Frank Sinatra 45 Когда Lvee Breaks Led Zeppelin 1 Ты тот, кого я хочу разного 5 Ты сделал меня не так, Брайан Ли 27 Ты потряс меня всю ночь напролет AC / DC 1 Ты мой лучший другQueen 1 Zion Fluke 5 Кто сотворил кто AC / DC 1 DT AC / DC 1 Мойка Pink AC / DC 1 Поездка на AC / DC 1 Гоняй на туз AC / DC 1 Уолт Ихр Бетс Ин Фламмен Сехен Раммштайн 3 Der Meister Rammstein 3Weisses Fleisch Rammstein 3 Seemann Rammstein 3 Du Riechst So Gut Rammstein 3 Das Alte Leid Rammstein 3 Heirate Mich Rammstein 3 Herzeleid Rammstein 3 Баба О'Рейли Кто 1 Сделка Кто 1 Любовь Не для того, чтобы держать кого 1 Моя жена Кто Кто 1Песня закончена над тем, кто 1 получает мелодию, кто 1 становится мобильным, кто 1 за голубыми глазами, кто 1 выигралОбмануть снова Кто Кто 1 Фолсом Тюрьма Блюз Джонни Кэш 189 Я иду по линии Джонни Кэш 189 Получаю ритм Джонни Кэш 189 Большая река Джонни Кэш 189 Угадай, что случилось таким образом Джонни Кэш 189 Кольцо Огня Джонни Кэш 189 Джексон Джонни Кэш 189 AМальчик по имени Сью (в прямом эфире) Джонни Кэш 189 Ты поднимешь меня, Села 205 Держись, я иду, The Canets Blues Band 27 У меня есть Mojo Работа на Canets Blues Band 27 Sweet Home ChicagoThe Canets Блюз-бэнд 27 Тяжелая любовь The Canets Блюз-бэнд 27 Холодное холодное чувство The Canets Блюз-бэнд 27 Одинокий проспект The Canets Блюз-бэнд 27 Доброе утро Маленькая школьница The Canets Блюз-бэнд 27 Посыпай мою метлу Канеты Блюз-бэнд 27 Дай мне 'Lovin Canets'Блюз-бэнд 27 Всем нужен кто-то, чтобы любить Канеты Блюз-бэнд 27 Черная магия Женщина Кантеты Блюз-бэнд 27 Steppin 'Rooster Канеты Блюз-бэнд 27 Наша любовь дрейфует с Канетами Блюз-бэнд 27 Doin' 100 Канеты Блюз-бэнд 27 Мать Джой Мэтт Эндер235 Плач солдата Стив Макдональд 235 Дюламан Алтан 235 Стрелка Крис Сферис 235 Испанский Глаза Ла Эсперанса 235 Банановая бухта Луис Виллегас 235 Агуас Де Марко Роза Пассос 235 Тамборея Энергипси 235 Унесенные Холли Смитом 235 Иммигрант Джоани Мэдден 235 Сигер-Кайс 235 Большой Кобер 235 Сигер 235 ПегШерил Ганн 235, плавающая навсегда Дин Эверсон 235 Открытая дорога Джефф Бэйли 261 Рубин Кайзер Чифс 263 Сердитая Вожак Кайзер Шеферс 263 Жара умирает Кайser Chiefs 263 Highroyds Kaiser Chiefs 263 Любовь - не соревнование (но я выигрываю) Kaiser Chiefs 263 Большое спасибо Kaiser Chiefs 263 Я могу сделать это без вас Kaiser Chiefs 263 Мой вид Guy Kaiser Chiefs 263 В наши дни все Kais Chiefs, все в среднем263 хорошо усвоили мой урок. Kaiser Chiefs. 263 Попробуй свои лучшие Kaiser Chiefs. 263 Отставные Kaiser Chiefs. 263 The Angry Mob [Live From Berlin] Kaiser Chiefs. 263 Мне нравится сражаться с Kaiser Chiefs. 263 От шеи.: Файл «C: \ Users \ Jeremiah \ Desktop \ Python \ code3 \ track \ track.py», строка 89, в genre_id = cur.fetchone () [0] TypeError: объект 'NoneType' не может быть подписан [Завершено в 1.415s]