-1

对于我的项目,我使用 mutagen 库从 5000+ mp3 文件中读取 ID3 标签。阅读它们后,我使用它们构造了以下对象。

    class Track:
    def __init__(self, artist, title, album=None):
        self.artist = artist
        self.title = title
        self.album = None

    def __str__(self):
        return "Track: %s : %s" % (self.artist,self.title, )

    def set_album(self,album):
        self.album = album

class Album:
    def __init__(self, artist, title, year='', genre='', tracks=None):
        self.artist = artist
        self.year = year
        self.genre = genre
        self.title = title 
        self.tracks = []

    def __str__(self):
        return "Album: %s : %s [%d]" % (self.artist,self.title,len(self.tracks))

    def add_track(self,track):
        self.tracks.append(track)

问题是某些文件缺少一些必需的标签(缺少标题、缺少艺术家或两者兼有),导致 KeyValueError

 #'TALB' (album title), 'TIT2' (track title), 'TPE1' (artist), 'TDRC' (year), and 'TCON' (genre)
    for root, dirs, files in os.walk(dir):
        for filename in files:
            if filename.lower().endswith(e):
                fullname = os.path.join(root, filename)
                try:
                    audio = mutagen.File(fullname)
                    track = Track(audio['TPE1'],audio['TIT2'])
                    album = Album(audio['TPE1'], audio['TALB'], audio['TDRC'], audio['TCON'])
                excpet Exception as e:
                                print "Error on %s. %s " % (filename,type(e).__name__)  

这会加载具有所有标签的所有文件,这还不够好。我通过使用 ifs 解决了这个问题,它工作正常并且足够快。但是我想知道是否有更好的方法来处理这个问题。

4

4 回答 4

1

如果您的默认值可以是空字符串而不是None您可以使用 defaultdict。

>>> 
>>> from collections import defaultdict
>>> d = defaultdict(str)
>>> d['a'] = 'data'
>>> d['b'] = 1
>>> d
defaultdict(<type 'str'>, {'a': 'data', 'b': 1})
>>> a = d['a']
>>> b = d['b']
>>> c = d['c']
>>> a, b, c
('data', 1, '')
>>> d
defaultdict(<type 'str'>, {'a': 'data', 'c': '', 'b': 1})
>>> 
于 2013-10-06T15:47:56.810 回答
1

是的,使用dict.get()

process(data.get('a'), data.get('b'), data.get('c'), data.get('d'))

这类似于doing dict[key],除了它不会引发KeyError,它会return None,或者它可以返回传递的第二个参数(默认为None)。

它类似于:

try:
    blah = data['a']
except ValueError:
    blah = None

或者:

if 'a' in data:
    blah = data['a']
else:
    blah = None
于 2013-10-06T13:52:32.903 回答
1

使用data.get("a")- 这将返回data["a"]if的值a作为键存在data,否则将返回None

于 2013-10-06T13:52:38.060 回答
0

你的陈述

a = data['a'] if 'a' in key else None

相当于这个更简洁(更高效)的语句:

a = data.get('a')

您也可以考虑只传递dataprocess

process(data)

最后,还有一些“巧妙”的方法可以做到这一点,这里可能没有保证,但是这些方面的东西可能会为您服务:

process(**data)
于 2013-10-06T13:53:00.297 回答