1

我正在尝试在 Mac OS El Capitan 系统上的 Python 2.7 下使用 plistlib 处理 iTunes plist。问题是 get('Tracks') 返回 3,006 个显然丢失了子键的值。如果我的目标是定位和更改特定轨道的数据而不是写回 plist,我该如何处理?

正如在上一段中所隐藏的那样,我需要帮助的是:打印轨道列出所有子键值,而不是子键本身鉴于并非所有键都被隔离存在,我如何检索特定轨道的键值?

这是我的测试代码:

import plistlib as pl

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

这是一个示例数据记录,我相信它包含所有可能的子键(如果键是空字符串、False 或数字 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>
4

1 回答 1

0

假设您的 iTunes plist 文件是这样的:

<?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)]
于 2017-01-04T03:56:15.990 回答