有哪位能看一下这个解析iTunes播放列表的程序?

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 
    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'

该回答引用GPTᴼᴾᴱᴺᴬᴵ,具体如下:

这个问题可能是因为 Python 版本不兼容导致的,因为在 Python 3.9 中,plistlib 模块中的 readPlist 方法已经被重命名为 load 方法。建议你使用 load 方法代替 readPlist 方法,代码如下:
import plistlib
import re,argparse
import sys
from matplotlib import pyplot
import numpy as np

def findDuplicates(fileName):
    print(f"在{fileName}中查找重复曲目")
    plist = plistlib.load(open(fileName, 'rb'))
    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.load(open(filename, 'rb'))
        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.load(open(fileName, 'rb'))
    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()

如果以上回答对您有所帮助,望采纳~谢谢