对于我的项目,我使用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解决了这个问题,它运行正常并且足够快。但是我想知道是否有更好的方法来解决这个问题。
答案 0 :(得分:1)
是的,请使用dict.get()
:
process(data.get('a'), data.get('b'), data.get('c'), data.get('d'))
这与执行dict[key]
类似,除了代替引发KeyError,它将return None
,或者它可以返回传递的第二个参数(默认为None)。
它类似于:
try:
blah = data['a']
except ValueError:
blah = None
或者:
if 'a' in data:
blah = data['a']
else:
blah = None
答案 1 :(得分:1)
使用data.get("a")
- 如果data["a"]
作为a
中的密钥存在,则会返回data
的值,否则会返回None
。< / p>
答案 2 :(得分: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})
>>>
答案 3 :(得分:0)
您的陈述
a = data['a'] if 'a' in key else None
等同于这种更简洁(也更有效)的陈述:
a = data.get('a')
您也可以考虑将data
传递给process
:
process(data)
最后,还有一些“光滑”的方法可以做到这一点,这里可能没有必要,但是这些方面的内容可能会为你提供帮助:
process(**data)