2016-12-30 39 views
1

我想在Mac OS El Capitan系統上使用Python 2.7下的plistlib處理iTunes plist。問題是get('Tracks')返回3,006個值,顯然已經丟失了它們的子鍵。如果我的目標是找到並修改軌跡數據,而不是將plist寫回去,我該如何處理這個問題?由於埋在前一段中,我所需要的幫助完全是這樣的:print tracks列出了所有的子鍵值,但是不是子鍵本身。鑑於並非所有密鑰都被隔離出現,我如何檢索特定音軌的關鍵值?處理iTunes plist與3,006個鍵值爲python 2與plistlib

這裏是我的測試代碼:

import plistlib as pl 

plist = pl.readPist('/Users/bryandunphy/Music/iTunes HQR/iTunes Library.xml') 
tracks = pl.get('Tracks') 
print tracks 

這裏是我認爲的示例數據記錄包含了所有可能的子鍵(按鍵均缺席,如果他們是空字符串,虛假或數字0):

<key>2655</key> 
    <dict> 
     <key>Track ID</key><integer>2655</integer> 
     <key>Size</key><integer>8558199</integer> 
     <key>Total Time</key><integer>210120</integer> 
     <key>Disc Number</key><integer>1</integer> 
     <key>Disc Count</key><integer>2</integer> 
     <key>Track Number</key><integer>5</integer> 
     <key>Track Count</key><integer>17</integer> 
     <key>Date Modified</key><date>2016-12-15T02:13:07Z</date> 
     <key>Date Added</key><date>2016-12-14T11:32:46Z</date> 
     <key>Bit Rate</key><integer>320</integer> 
     <key>Sample Rate</key><integer>44100</integer> 
     <key>Persistent ID</key><string>7BD213A791587573</string> 
     <key>Track Type</key><string>File</string> 
     <key>File Type</key><integer>1295270176</integer> 
     <key>File Folder Count</key><integer>5</integer> 
     <key>Library Folder Count</key><integer>1</integer> 
     <key>Name</key><string>Born To Be Wild</string> 
     <key>Artist</key><string>Steppenwolf</string> 
     <key>Album Artist</key><string>Steppenwolf</string> 
     <key>Album</key><string>Born To Be Wild: A Retrospective</string> 
     <key>Genre</key><string>Rock</string> 
     <key>Kind</key><string>AAC audio file</string> 
     <key>Sort Album Artist</key><string>Steppenwolf</string> 
     <key>Location</key><string>file:///Users/bryandunphy/Music/iTunes%20HQR/iTunes%20Media/Music/Steppenwolf/Born%20To%20Be%20Wild_%20A%20Retrospective/1-05%20Born%20To%20Be%20Wild.m4a</string> 
    </dict> 

上面記錄的文件的開頭是:

<?xml version="1.0" encoding="UTF-8"?> 
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
    <plist version="1.0"> 
    <dict> 
     <key>Major Version</key><integer>1</integer> 
     <key>Minor Version</key><integer>1</integer> 
     <key>Application Version</key><string>12.5.4.42</string> 
     <key>Date</key><date>2017-01-02T02:41:51Z</date> 
     <key>Features</key><integer>5</integer> 
     <key>Show Content Ratings</key><true/> 
     <key>Library Persistent ID</key><string>4FA8621533B66A9E</string> 
     <key>Tracks</key> 
    <dict> 
+0

您應該編輯問題以顯示您已寫入的一些代碼。你可能還想添加更多的標籤,比如普通的'python'標籤,如果有相關的標籤,可能還會添加'plistlib'標籤。 – Blckknght

+0

我想編輯問題和標籤,但我不知道該怎麼做。 –

+0

應該在當前標籤下面有一個「編輯」鏈接。 – Blckknght

回答

0

讓我們說你的iTunes的plist˚F ILE是這樣的:

<?xml version="1.0" encoding="utf-8"?> 
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> 
<plist version="1.0"> 
<dict> 
    <key>Major Version</key><integer>1</integer> 
    <key>Minor Version</key><integer>1</integer> 
    <key>Application Version</key><string>4.6</string> 
    <key>Music Folder</key> 
    <string>/Users/bryandunphy/Music/iTunes HQR/iTunes Library.xml</string> 
    <key>Library Persistent ID</key><string>8E84CC790968E27F</string> 
    <key>Tracks</key> 
    <dict> 
    <key>2655</key> 
    <dict> 
     <key>Track ID</key><integer>2655</integer> 
     <key>Size</key><integer>8558199</integer> 
     <key>Total Time</key><integer>210120</integer> 
     <key>Disc Number</key><integer>1</integer> 
     <key>Disc Count</key><integer>2</integer> 
     <key>Track Number</key><integer>5</integer> 
     <key>Track Count</key><integer>17</integer> 
     <key>Date Modified</key><date>2016-12-15T02:13:07Z</date> 
     <key>Date Added</key><date>2016-12-14T11:32:46Z</date> 
     <key>Bit Rate</key><integer>320</integer> 
     <key>Sample Rate</key><integer>44100</integer> 
     <key>Persistent ID</key><string>7BD213A791587573</string> 
     <key>Track Type</key><string>File</string> 
     <key>File Type</key><integer>1295270176</integer> 
     <key>File Folder Count</key><integer>5</integer> 
     <key>Library Folder Count</key><integer>1</integer> 
     <key>Name</key><string>Born To Be Wild</string> 
     <key>Artist</key><string>Steppenwolf</string> 
     <key>Album Artist</key><string>Steppenwolf</string> 
     <key>Album</key><string>Born To Be Wild: A Retrospective</string> 
     <key>Genre</key><string>Rock</string> 
     <key>Kind</key><string>AAC audio file</string> 
     <key>Sort Album Artist</key><string>Steppenwolf</string> 
     <key>Location</key><string>file:///Users/bryandunphy/Music/iTunes%20HQR/iTunes%20Media/Music/Steppenwolf/Born%20To%20Be%20Wild_%20A%20Retrospective/1-05%20Born%20To%20Be%20Wild.m4a</string> 
    </dict> 
    </dict> 
</dict> 
</plist> 

您的測試代碼將輸出一個像這樣的詞典:

{'2655': {'Album': 'Born To Be Wild: A Retrospective', 'Persistent ID': '7BD213A791587573', 'Track Number': 5, 'Album Artist': 'Steppenwolf', 'Track Type': 'File', 'File Folder Count': 5, 'Disc Number': 1, 'Total Time': 210120, 'Artist': 'Steppenwolf', 'Track Count': 17, 'Genre': 'Rock', 'Bit Rate': 320, 'Kind': 'AAC audio file', 'Name': 'Born To Be Wild', 'Sample Rate': 44100, 'Disc Count': 2, 'Sort Album Artist': 'Steppenwolf', 'File Type': 1295270176, 'Track ID': 2655, 'Location': 'file:///Users/bryandunphy/Music/iTunes%20HQR/iTunes%20Media/Music/Steppenwolf/Born%20To%20Be%20Wild_%20A%20Retrospective/1-05%20Born%20To%20Be%20Wild.m4a', 'Date Modified': datetime.datetime(2016, 12, 15, 2, 13, 7), 'Library Folder Count': 1, 'Date Added': datetime.datetime(2016, 12, 14, 11, 32, 46), 'Size': 8558199}} 

如果你想獲得每首曲目的子鍵的值,你可以像這樣的代碼:

for id, track_info in tracks.items(): 
    print id, track_info.values() 

的輸出是這樣的:

2655 ['Born To Be Wild: A Retrospective', '7BD213A791587573', 5, 'Steppenwolf', 'File', 5, 1, 210120, 'Steppenwolf', 17, 'Rock', 320, 'AAC audio file', 'Born To Be Wild', 44100, 2, 'Steppenwolf', 1295270176, 2655, 'file:///Users/bryandunphy/Music/iTunes%20HQR/iTunes%20Media/Music/Steppenwolf/Born%20To%20Be%20Wild_%20A%20Retrospective/1-05%20Born%20To%20Be%20Wild.m4a', datetime.datetime(2016, 12, 15, 2, 13, 7), 1, datetime.datetime(2016, 12, 14, 11, 32, 46), 8558199] 

您可以使用track_info.items()來替代,以便您可以獲得像這樣的鍵值對:

2655 [('Album', 'Born To Be Wild: A Retrospective'), ('Persistent ID', '7BD213A791587573'), ('Track Number', 5), ('Album Artist', 'Steppenwolf'), ('Track Type', 'File'), ('File Folder Count', 5), ('Disc Number', 1), ('Total Time', 210120), ('Artist', 'Steppenwolf'), ('Track Count', 17), ('Genre', 'Rock'), ('Bit Rate', 320), ('Kind', 'AAC audio file'), ('Name', 'Born To Be Wild'), ('Sample Rate', 44100), ('Disc Count', 2), ('Sort Album Artist', 'Steppenwolf'), ('File Type', 1295270176), ('Track ID', 2655), ('Location', 'file:///Users/bryandunphy/Music/iTunes%20HQR/iTunes%20Media/Music/Steppenwolf/Born%20To%20Be%20Wild_%20A%20Retrospective/1-05%20Born%20To%20Be%20Wild.m4a'), ('Date Modified', datetime.datetime(2016, 12, 15, 2, 13, 7)), ('Library Folder Count', 1), ('Date Added', datetime.datetime(2016, 12, 14, 11, 32, 46)), ('Size', 8558199)] 
+0

感謝您的幫助。重寫的測試代碼現在正確解析文件。 –