パンダの休日

雑多な書き残し

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
先日書いたスクレイピングの記事、そこそこ見にくる人がいたようなので今回はHTMLParserを応用したネタを一つ。
タイトルにあるようにiTunes Music Liblary.xml を CSVにします。

何のことかと言うと、iTunesに登録された楽曲はiTunes Music Liblary.xml というデータで管理されていてこのファイルの中には歌手・曲名や再生回数スキップ回数など色々な情報が収まっています。
iTunesでは再生回数順に並び替えなどは出来ますがその曲の総再生時間(再生回数×曲の長さ)などは出せません。
そこで総再生時間順に並び替えた表を見るべくCSVファイルを作り、Excelなどで見られるようにします。
iTunes Music Liblary.xml は通常マイミュージックのiTunesフォルダの中に置いてあるのでそれをコピーしてきます。

スクリプトは以下のような感じで。
HTMLParserは<タグ>と< /タグ>の間に挟まれたデータを抜き出すために使っています。
真ん中で幅を取ってるのはCSVファイルをwith構文で書き込むためのクラスです。
正直こんな面倒なことしなくても標準出力から > ***.csvでもいいのですが、作り置きのクラスなので引用しておきました。
最後の方の#sortの周辺を弄れば並び替えが変わります。今回は総再生時間で。
(ハイライターの使い方を調べるもよく分からず、下敷きを入れるにとどまりました。)


from html.parser import HTMLParser

class iMLparser(HTMLParser):
def __init__(self):
HTMLParser.__init__(self)
self.keydic = {"Track ID":0,
"Name":1,
"Artist":2,
"Album Artist":3,
"Album":4,
"Play Count":5,
"Skip Count":6,
"Total Time":7}
self.tmplist = []
self.iMLdata = []
self.state = -1
def handle_startendtag(self, tagname, attrs): #今回は不使用
pass
#print(tagname, attrs)
def handle_endtag(self,tagname): #今回は不使用
pass
#print(tagname)
def handle_data(self, data):
if self.state in [0, 5, 6, 7]:
data = int(data)
else:
data = str(data).replace(",",";")
if 0 <= self.state:
self.tmplist[self.state] = data
if data == "Track ID":
self.tmplist = [0]*len(self.keydic)
if data == "Location":
self.tmplist.append(self.tmplist[5]*
self.tmplist[7]//60000) #総再生時間を追加
self.iMLdata.append(self.tmplist)
self.state = self.keydic.get(data, -1)
#print(data)
def output(self):
return(self.iMLdata)

class mkcsv():
"""
Make csv file.
Initialize with filename(str).
Use in "with".
with mkcsv("filename") as csvfile:
csvfile.csvwrite(list)
"""

def __init__(self, filename):
from os import getcwd
self.csvfile = open(filename+".csv", "w", encoding="utf-8")
print("{0} was made in {1}".format(self.csvfile.name, getcwd()))

def __enter__(self):
return self

def __exit__(self, exc_type, exc_value, traceback):
self.csvfile.close()
print("closed {}.".format(self.csvfile.name))

def csvwrite(self, wlist):
for i in wlist:
i = str(i)
self.csvfile.write(i)
self.csvfile.write(",")
self.csvfile.write("\n")

def csvclose(self):
self.csvfile.close()
print("{} was closed.".format(self.csvfile.name))

def main():
parser = iMLparser()
iMLfile = open("iML.xml", "r",encoding="utf-8")
data = iMLfile.read()
parser.feed(data)
iMLlist = parser.output()
iMLlist.sort(key= lambda x:x[8])#sort
iMLlist.reverse()
iMLlist.insert(0,["ID", "Name", "Artist", "Album Artist", "Album",
"Play", "Skip", "Total Time", "Total Played Time(min)"])
with mkcsv("iMLlist") as csvfile:
for i in iMLlist:
#print(i)
csvfile.csvwrite(i)

if __name__ == '__main__':
main()

スポンサーサイト

shader

Author:shader
多趣味飽き性に振り回されて色々やってます。

直接連絡したい方は御気軽にメールしてください。 3日以内には返信させて頂きます。

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。