Python?plist文件的讀取方式
Python練習(xí):讀取Apple Plist文件
Plist文件簡(jiǎn)介
- ??定義??:Apple公司創(chuàng)建的基于XML結(jié)構(gòu)的文件格式
- ??特點(diǎn)??:采用XML語法組織數(shù)據(jù),可存儲(chǔ)鍵值對(duì)、數(shù)組等結(jié)構(gòu)化信息
- 文件擴(kuò)展名??:.plist
- 應(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)
- 始終使用??二進(jìn)制模式??(‘rb’)打開文件 Python
- 3.4+ 支持load()/dump()替代舊版API
- 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關(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-09pandas數(shù)據(jù)處理清洗實(shí)現(xiàn)中文地址拆分案例
因?yàn)楹罄m(xù)數(shù)據(jù)分析工作需要用到地理維度進(jìn)行分析,所以需要把login_place字段進(jìn)行拆分成:國(guó)家、省份、地區(qū)。感興趣的可以了解一下2021-06-06python 中的paramiko模塊簡(jiǎn)介及安裝過程
這篇文章主要介紹了python 中的paramiko模塊簡(jiǎn)介及安裝過程,通過實(shí)例詳解給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-02-02python rolling regression. 使用 Python 實(shí)現(xiàn)滾動(dòng)回歸操作
這篇文章主要介紹了python rolling regression. 使用 Python 實(shí)現(xiàn)滾動(dòng)回歸操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-06-06python 進(jìn)程的幾種創(chuàng)建方式詳解
這篇文章主要介紹了python 進(jìn)程的幾種創(chuàng)建方式詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python?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)收取能量的小助手
大家都有了解過螞蟻森林吧,本篇文章帶給你自動(dòng)收取螞蟻森林能量的思路與方法,基于appium模塊開發(fā)一個(gè)自動(dòng)收取能量的小助手,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的價(jià)值2021-09-09原來我一直安裝 Python 庫(kù)的姿勢(shì)都不對(duì)呀
平常我都是直接執(zhí)行 pip install 安裝的第三方庫(kù),很多教程也是這么介紹的,一直以來我都認(rèn)為這是標(biāo)準(zhǔn)的、正確的安裝 Python 第三方庫(kù)的姿勢(shì)。下面小編給大家分享一篇教程,一起看看吧2019-11-11