xingshong 2023-03-23 13:22 采纳率: 50%
浏览 26
已结题

有哪位能看一下这个解析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 <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'
  • 写回答

1条回答 默认 最新

  • Leodong. 2023-03-23 13:35
    关注

    该回答引用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()
    

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

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 3月25日
  • 创建了问题 3月23日

悬赏问题

  • ¥15 电脑蓝屏logfilessrtsrttrail问题
  • ¥20 关于wordpress建站遇到的问题!(语言-php)(相关搜索:云服务器)
  • ¥15 【求职】怎么找到一个周围人素质都很高不会欺负他人,并且未来月薪能够达到一万以上(技术岗)的工作?希望可以收到写有具体,可靠,已经实践过了的路径的回答?
  • ¥15 Java+vue部署版本反编译
  • ¥100 对反编译和ai熟悉的开发者。
  • ¥15 带序列特征的多输出预测模型
  • ¥15 Python 如何安装 distutils模块
  • ¥15 关于#网络#的问题:网络是从楼上引一根网线下来,接了2台傻瓜交换机,也更换了ip还是不行
  • ¥15 资源泄露软件闪退怎么解决?
  • ¥15 CCF-CSP 2023 第三题 解压缩(50%)