import plistlib
import re,argparse
import sys
from matplotlib import pyplot
import numpy as np
def findDuplicates(fileName):
print(f"在{fileName}中查找重复曲目")
plist = plistlib.readPlist(fileName)
tracks = plist['Tracks']
trackNames = {}
for trackID,track in tracks.items():
try:
name = track['Name']
duration = track['Total Time']
if name in trackNames:
if duration//1000 == trackNames[name][0]//1000:
count = trackNames[name] = (duration,count+1)
else:
trackNames[name] = (duration,1)
except:
pass
dups = []
for k,v in trackNames.items():
if v[1] > 1:
dups.append((v[1],k))
if len(dups) > 0:
print(f"发现{len(dups)}重复。曲目名称保存到dup.txt")
else:
print("未找到重复曲目!")
f = open("dups.txt","w")
for val in dups:
f.write(f"[{val[0]}] {val[1]}\n")
f.close()
def findCommonTracks(fileNames):
trackNameSets = []
for filename in fileNames:
trackNames = set()
plist = plistlib.readPlist(filename)
tracks = plist['Tracks']
for trackID,track in tracks.items():
try:
trackNames.add(track['Name'])
except:
pass
trackNameSets.append(trackNames)
commonTracks = set.intersection(*trackNameSets)
if len(commonTracks) > 0:
f = open("common.txt","w")
for val in commonTracks:
s = f"{val}\n"
f.write(s.encode("UTF-8"))
f.close()
print(f"{len(commonTracks)}找到常见轨迹"
"写入common.txt的曲目名称")
else:
print("没有公共轨道!")
def plotStats(fileName):
plist = plistlib.readPlist(fileName)
tracks = plist['Tracks']
ratings = []
durations = []
for trackID,track in tracks.items():
try:
ratings.append(track['Album Rating'])
durations.append(track['Total Time'])
except:
pass
if ratings == [] or durations == []:
print(f"{fileName}中没有有效的唱片集评分/总时间数据")
return
x = np.array(durations,np.int32)
x = x/60000.0
y = np.array(ratings,np.int32)
pyplot.subplot(2,1,1)
pyplot.plot(x,y,'o')
pyplot.axis([0,1.05*np.max(x),-1,110])
pyplot.xlabel('轨道持续时间')
pyplot.ylabel('轨道评级')
pyplot.subplot(2,1,2)
pyplot.xlabel('轨道持续时间')
pyplot.ylabel('计数')
pyplot.show()
def main():
descStr = """
此程序分析从iTunes导出的播放列表文件(.xml)
"""
parser = argparse.ArgumentParser(description=descStr)
group = parser.add_mutually_exclusive_group()
group.add_argument('--common',nargs='*',dest='plFiles',required=False)
group.add_argument('--stats',dest='plFile',required=False)
group.add_argument('--dup',dest='plFileD',required=False)
args = parser.parse_args()
if args.plFiles:
findCommonTracks(args.plFiles)
elif args.plFile:
plotStats(args.plFile)
elif args.plFileD:
findDuplicates(args.plFileD)
else:
print("这些不是你要找的曲目")
if __name__ == '__main__':
main()
错误:
Traceback (most recent call last):
File "/Users/fym/Desktop/*** 编程/playlist.py", line 102, in <module>
main()
File "/Users/fym/Desktop/*** 编程/playlist.py", line 94, in main
findCommonTracks(args.plFiles)
File "/Users/fym/Desktop/*** 编程/playlist.py", line 38, in findCommonTracks
plist = plistlib.readPlist(filename)
AttributeError: module 'plistlib' has no attribute 'readPlist'