2016-12-30 41 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

感谢您的帮助。重写的测试代码现在正确解析文件。 –