-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か、渡された 2 番目のパラメーターを返すことができます (デフォルトは 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"]場合は の値を返し、そうでない場合は を返します。adataNone

于 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 に答える