Python plist文件的读取方式

 更新时间:2025年07月18日 11:12:16   作者:caron4  
这篇文章给大家介绍Python plist文件的读取方式,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧

Python练习:读取Apple Plist文件

Plist文件简介

  1. ​​定义​​:Apple公司创建的基于XML结构的文件格式
  2. ​​特点​​:采用XML语法组织数据,可存储键值对、数组等结构化信息
  3. 文件扩展名​​:.plist
  4. 应用场景:
    ​​iOS系统:​​ 应用描述文件(权限配置:蓝牙/网络访问/GameCenter等)IPA安装包中的配置信息 ​​
    macOS系统​​: .app应用的配置文件 系统偏好设置存储 ​​
    苹果生态​​ iTunes音乐播放列表 Xcode项目配置

Python操作库:plistlib

import plistlib

代码适配指南(Python 2 → Python 3)
​​废弃方法​​(Python 2旧版)

plist = plistlib.read(filename)

​​正确方法​​(Python 3新版)

with open(filename, 'rb') as plist_file:
    plist = plistlib.load(plist_file)

注意事项

  1. 始终使用​​二进制模式​​(‘rb’)打开文件 Python
  2. 3.4+ 支持load()/dump()替代旧版API
  3. macOS内置plutil工具可验证文件有效性:bash 下运行下面的代码
    plutil -lint Example.plist

下文是练习代码,其中也包含了画图部分
练习代码:

import re, argparse
import sys
from matplotlib import pyplot
import plistlib
import numpy as np
# 找到重复的音乐
def find_duplicates(file_name):
    print("Find duplicate tracks in %s..." % file_name)
    with open(file_name, 'rb') as f:
        plist = plistlib.load(f)
    # 读取playlist
    # 获取音轨目录
    tracks = plist['Tracks']
    # 创建音轨字典
    track_names = {}
    # 结构:{name:(duration,count)}
    # 遍历 添加
    for track_id, track in tracks.items():
        try:
            name = track['name']
            duration = track['Total Time']
            # 检查是不是以及在在字典里面了
            if name in track_names:
            # 匹配 歌曲名称和时长
                if duration // 1000 == track_names['name'][0] // 1000:
                    count = track_names[name][1]
                    track_names[name] = (duration, count + 1)
            else:
                # 不匹配的情况下
                track_names[name] = (duration, count)
        except:
            # ignore
            pass
    # 保存重复的音轨, name, count
    dups = []
    for k, v in track_names.items():
        if v[1] > 1:
            dups.append(k, v[1])
    # 保存到一个文件
    if len(dups) > 0:
        print("发现一共有%d个重复的文件, 以及保存到了dup.txt中" % len(dups))
    else:
        print("没有发现任何重复的文件")
    f = open("dups.txt", "w")
    for val in dups:
        f.writable("[%d] %s \n" % (val[0], val[1]))
    f.close()
# 查找多个播放列表中的共同的音轨
def find_common_tracks(file_names):
    # a list of sets of track names
    track_name_sets = []
    # 遍历读取多个plist文件
    for file_name in file_names:
        track_names = set()
        with open(file_name, 'rb') as f:
            plist = plistlib.load(f)
        # 获取音轨节点
        tracks = plist.get("Tracks", {})
        # 遍历迭代
        for track_id, track in tracks.items():
            try:
                track_names.add(track['Name'])
            except:
                # ignore
                pass
    # 添加到track_name_sets中
    track_name_sets.append(track_names)
    # 交集处理
    common_tracks = set.intersection(*track_name_sets)
    # 写文件
    if len(common_tracks) > 0:
        f = open("common.txt", "w")
        for val in common_tracks:
            # s = "%s\n" % val
            f.write(f"{val}\n")
        f.close()
        print(f"Track names wirte to common.txt { len(common_tracks)}")
    else:
        print("No common tracks!")
# 收集歌曲评分和时长
def plot_stats(file_name):
    # 读取播放列表
    with open(file_name, 'rb') as f:
        plist = plistlib.load(f)
    tracks = plist['Tracks']
    # 创建音轨排序和时长
    ratings = []
    durations = []
    for track_id, track in tracks.items():
        try:
            ratings.append(track['Album Rating'])
            durations.append(track['Total Time'])
        except:
            # ignore
            pass
    # 确保是有效数据
    if ratings == [] or durations == []:
        print(f"在文件中%s没有有效的Album Rating/Total Time  数据 {file_name}")
        return
     # scatter plot 
    x= np.array(durations, np.int32) 
    # convert to minutes 
    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('Track duration') 
    pyplot.ylabel('Track rating') 
    # plot histogram 
    pyplot.subplot(2, 1, 2) 
    pyplot.hist(x, bins=20) 
    pyplot.xlabel('Track duration') 
    pyplot.ylabel('Count') 
    # show plot 
    pyplot.show() 
def main():
    # create parser
    descStr = """
    This program analyzes playlist files (.xml) exported from iTunes.
    """
    parser = argparse.ArgumentParser(description=descStr)
    # add a mutually exclusive group of arguments
    group = parser.add_mutually_exclusive_group()
    # add expected arguments
    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)
    # parse args
    args = parser.parse_args()
    if args.plFiles:
        # find common tracks
        find_common_tracks(args.plFiles)
    elif args.plFile:
        # plot stats
        plot_stats(args.plFile)
    elif args.plFileD:
        # find duplicate tracks
        find_duplicates(args.plFileD)
    else:
        print("These are not the tracks you are looking for.")
if __name__ == "__main__":
    main()

最后这个是画图的部分,以后有兴趣再研究吧

到此这篇关于Python plist文件的读取方式的文章就介绍到这了,更多相关Python读取plist文件内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:

相关文章

  • python3.6+selenium实现操作Frame中的页面元素

    python3.6+selenium实现操作Frame中的页面元素

    这篇文章主要为大家详细介绍了python3.6+selenium实现操作Frame中的页面元素,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • 从基础到高级详解Python多容器迭代完全指南

    从基础到高级详解Python多容器迭代完全指南

    在现代软件开发中,处理多种容器类型是日常任务的核心,Python提供了强大的多容器迭代工具,但许多开发者未能充分利用其全部潜力,下面小编就来和大家详细讲讲吧
    2025-09-09
  • 详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件

    详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件

    这篇文章主要介绍了详解使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-08-08
  • python中如何写类

    python中如何写类

    在本篇文章里小编给大家分享的是一篇关于python中写类的方法和技巧,需要的朋友们可以学习下。
    2020-06-06
  • Python视频处理之提取关键帧的完整指南

    Python视频处理之提取关键帧的完整指南

    视频关键帧提取是从视频序列中选择最具代表性的帧,这些帧能够有效概括视频内容,本文将为大家详细介绍一下使用Python提取关键帧的详细步骤,有需要的可以了解下
    2025-12-12
  • Keras 快速解决OOM超内存的问题

    Keras 快速解决OOM超内存的问题

    这篇文章主要介绍了Keras 快速解决OOM超内存的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-06-06
  • python3爬取淘宝信息代码分析

    python3爬取淘宝信息代码分析

    本篇文章通过代码实例给大家分享了python3爬取淘宝信息的过程以及实例分析,对此有兴趣的朋友学习下。
    2018-02-02
  • Python实现九宫格式的朋友圈功能内附“马云”朋友圈

    Python实现九宫格式的朋友圈功能内附“马云”朋友圈

    PIL(Python Imaging Library)是一个非常强大的Python库,但是它支持Python2.X, 在Python3中则使用的是Pillow库,它是从PIL中fork出来的一个分支。这篇文章主要介绍了用Python搞定九宫格式的朋友圈功能内附“马云”朋友圈 ,需要的朋友可以参考下
    2019-05-05
  • python虚拟环境迁移方法

    python虚拟环境迁移方法

    今天小编就为大家分享一篇python虚拟环境迁移方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2019-01-01
  • PyTorch中clone()、detach()及相关扩展详解

    PyTorch中clone()、detach()及相关扩展详解

    这篇文章主要给大家介绍了关于PyTorch中clone()、detach()及相关扩展的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论