欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Python?plist文件的讀取方式

 更新時(shí)間:2025年07月18日 11:12:16   作者:caron4  
這篇文章給大家介紹Python?plist文件的讀取方式,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧

Python練習(xí):讀取Apple Plist文件

Plist文件簡(jiǎn)介

  1. ??定義??:Apple公司創(chuàng)建的基于XML結(jié)構(gòu)的文件格式
  2. ??特點(diǎn)??:采用XML語法組織數(shù)據(jù),可存儲(chǔ)鍵值對(duì)、數(shù)組等結(jié)構(gòu)化信息
  3. 文件擴(kuò)展名??:.plist
  4. 應(yīng)用場(chǎng)景:
    ??iOS系統(tǒng):?? 應(yīng)用描述文件(權(quán)限配置:藍(lán)牙/網(wǎng)絡(luò)訪問/GameCenter等)IPA安裝包中的配置信息 ??
    macOS系統(tǒng)??: .app應(yīng)用的配置文件 系統(tǒng)偏好設(shè)置存儲(chǔ) ??
    蘋果生態(tài)?? iTunes音樂播放列表 Xcode項(xiàng)目配置

Python操作庫(kù):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)

注意事項(xiàng)

  1. 始終使用??二進(jìn)制模式??(‘rb’)打開文件 Python
  2. 3.4+ 支持load()/dump()替代舊版API
  3. macOS內(nèi)置plutil工具可驗(yàn)證文件有效性:bash 下運(yùn)行下面的代碼
    plutil -lint Example.plist

下文是練習(xí)代碼,其中也包含了畫圖部分
練習(xí)代碼:

import re, argparse
import sys
from matplotlib import pyplot
import plistlib
import numpy as np
# 找到重復(fù)的音樂
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']
    # 創(chuàng)建音軌字典
    track_names = {}
    # 結(jié)構(gòu):{name:(duration,count)}
    # 遍歷 添加
    for track_id, track in tracks.items():
        try:
            name = track['name']
            duration = track['Total Time']
            # 檢查是不是以及在在字典里面了
            if name in track_names:
            # 匹配 歌曲名稱和時(shí)長(zhǎng)
                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
    # 保存重復(fù)的音軌, name, count
    dups = []
    for k, v in track_names.items():
        if v[1] > 1:
            dups.append(k, v[1])
    # 保存到一個(gè)文件
    if len(dups) > 0:
        print("發(fā)現(xiàn)一共有%d個(gè)重復(fù)的文件, 以及保存到了dup.txt中" % len(dups))
    else:
        print("沒有發(fā)現(xiàn)任何重復(fù)的文件")
    f = open("dups.txt", "w")
    for val in dups:
        f.writable("[%d] %s \n" % (val[0], val[1]))
    f.close()
# 查找多個(gè)播放列表中的共同的音軌
def find_common_tracks(file_names):
    # a list of sets of track names
    track_name_sets = []
    # 遍歷讀取多個(gè)plist文件
    for file_name in file_names:
        track_names = set()
        with open(file_name, 'rb') as f:
            plist = plistlib.load(f)
        # 獲取音軌節(jié)點(diǎn)
        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!")
# 收集歌曲評(píng)分和時(shí)長(zhǎng)
def plot_stats(file_name):
    # 讀取播放列表
    with open(file_name, 'rb') as f:
        plist = plistlib.load(f)
    tracks = plist['Tracks']
    # 創(chuàng)建音軌排序和時(shí)長(zhǎng)
    ratings = []
    durations = []
    for track_id, track in tracks.items():
        try:
            ratings.append(track['Album Rating'])
            durations.append(track['Total Time'])
        except:
            # ignore
            pass
    # 確保是有效數(shù)據(jù)
    if ratings == [] or durations == []:
        print(f"在文件中%s沒有有效的Album Rating/Total Time  數(shù)據(jù) {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()

最后這個(gè)是畫圖的部分,以后有興趣再研究吧

到此這篇關(guān)于Python plist文件的讀取方式的文章就介紹到這了,更多相關(guān)Python讀取plist文件內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python文件與文件夾常見基本操作總結(jié)

    Python文件與文件夾常見基本操作總結(jié)

    這篇文章主要介紹了Python文件與文件夾常見基本操作,結(jié)合實(shí)例形式總結(jié)分析了Python針對(duì)文件與文件夾操作所涉及的常見函數(shù)與方法的使用技巧,需要的朋友可以參考下
    2016-09-09
  • python 如何設(shè)置守護(hù)進(jìn)程

    python 如何設(shè)置守護(hù)進(jìn)程

    這篇文章主要介紹了python 如何設(shè)置守護(hù)進(jìn)程,幫助大家更好的理解和使用python,感興趣的朋友可以了解下
    2020-10-10
  • Python關(guān)于sys.argv[]的用法及說明

    Python關(guān)于sys.argv[]的用法及說明

    sys.argv[]是Python中用于從程序外部獲取參數(shù)的列表,參數(shù)索引從0開始,0索引代表腳本名稱本身,后續(xù)索引代表傳遞給腳本的參數(shù),通過指定索引可以獲取特定的參數(shù),如sys.argv[1]獲取第一個(gè)傳入?yún)?shù),當(dāng)傳入多個(gè)參數(shù)時(shí),可以通過切片或循環(huán)獲取全部參數(shù)
    2024-09-09
  • pandas數(shù)據(jù)處理清洗實(shí)現(xiàn)中文地址拆分案例

    pandas數(shù)據(jù)處理清洗實(shí)現(xiàn)中文地址拆分案例

    因?yàn)楹罄m(xù)數(shù)據(jù)分析工作需要用到地理維度進(jìn)行分析,所以需要把login_place字段進(jìn)行拆分成:國(guó)家、省份、地區(qū)。感興趣的可以了解一下
    2021-06-06
  • python 中的paramiko模塊簡(jiǎn)介及安裝過程

    python 中的paramiko模塊簡(jiǎn)介及安裝過程

    這篇文章主要介紹了python 中的paramiko模塊簡(jiǎn)介及安裝過程,通過實(shí)例詳解給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-02-02
  • python rolling regression. 使用 Python 實(shí)現(xiàn)滾動(dòng)回歸操作

    python rolling regression. 使用 Python 實(shí)現(xiàn)滾動(dòng)回歸操作

    這篇文章主要介紹了python rolling regression. 使用 Python 實(shí)現(xiàn)滾動(dòng)回歸操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2020-06-06
  • python 進(jìn)程的幾種創(chuàng)建方式詳解

    python 進(jìn)程的幾種創(chuàng)建方式詳解

    這篇文章主要介紹了python 進(jìn)程的幾種創(chuàng)建方式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-08-08
  • Python?Numpy布爾數(shù)組在數(shù)據(jù)分析中的應(yīng)用小結(jié)

    Python?Numpy布爾數(shù)組在數(shù)據(jù)分析中的應(yīng)用小結(jié)

    本文深入探討了Python的Numpy庫(kù)中的布爾數(shù)組功能,介紹了布爾運(yùn)算、布爾索引的使用方法,并通過示例展示了如何在數(shù)據(jù)分析中利用布爾數(shù)組進(jìn)行數(shù)據(jù)篩選和處理,感興趣的朋友一起看看吧
    2024-09-09
  • 用python基于appium模塊開發(fā)一個(gè)自動(dòng)收取能量的小助手

    用python基于appium模塊開發(fā)一個(gè)自動(dòng)收取能量的小助手

    大家都有了解過螞蟻森林吧,本篇文章帶給你自動(dòng)收取螞蟻森林能量的思路與方法,基于appium模塊開發(fā)一個(gè)自動(dòng)收取能量的小助手,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值
    2021-09-09
  • 原來我一直安裝 Python 庫(kù)的姿勢(shì)都不對(duì)呀

    原來我一直安裝 Python 庫(kù)的姿勢(shì)都不對(duì)呀

    平常我都是直接執(zhí)行 pip install 安裝的第三方庫(kù),很多教程也是這么介紹的,一直以來我都認(rèn)為這是標(biāo)準(zhǔn)的、正確的安裝 Python 第三方庫(kù)的姿勢(shì)。下面小編給大家分享一篇教程,一起看看吧
    2019-11-11

最新評(píng)論