2016-01-20 18 views
5

私は、サウンドファイルからメタデータを取得し、目的の値を持つ文字列を作成する小さなスクリプトをコーディングしています。私は何か間違っていることを知っていますが、私はなぜそれがわからないのですが、おそらく私がifを繰り返す方法です。私はコードを実行すると:このPythonコードがランダムに動作する理由を理解する

import os, mutagen 

XPATH= "/home/xavier/Code/autotube/tree/def" 

DPATH="/home/xavier/Code/autotube/tree/down" 


def get_meta(): 
    for dirpath, directories,files in os.walk(XPATH): 
     for sound_file in files : 
      if sound_file.endswith('.flac'): 
       from mutagen.flac import FLAC 
       metadata = mutagen.flac.Open(os.path.join(dirpath,sound_file)) 
       for (key, value) in metadata.items(): 
        #print (key,value) 
        if key.startswith('date'): 
         date = value 
         print(date[0]) 

        if key.startswith('artist'): 
         artist = value 
         #print(artist[0]) 
        if key.startswith('album'): 
         album = value 
         #print(album[0]) 
        if key.startswith('title'): 
         title = value 
         #print(title[0]) 
         build_name(artist,album,title) # UnboundLocalError gets raised here 


def build_name(artist,album,title): 
    print(artist[0],album[0],title[0]) 

を私はランダムに、望ましい結果やエラーが表示されます。

結果:

1967 Ravi Shankar & Yehudi Menuhin West Meets East Raga: Puriya Kalyan 

がERROR:

Traceback (most recent call last): 
    File "<stdin>", line 39, in <module> 
    File "<stdin>", line 31, in get_meta 
    build_name(artist,album,title) 
UnboundLocalError: local variable 'album' referenced before assignment 
+0

あなたは 'for'ループ、一部では' if'ブロックを見れば 'for'ループ – Arman

+0

'前に「」= 'アルバムを追加iterationsは 'album'を割り当てます。いくつかは 'アルバム'を試してみてください。 'album'を使用しようとする条件が' album'割り当てに至る条件の前に起こる場合、未割り当て変数を使用しようとしています。 – khelwood

+3

あなたは 'import random'を持っていないので、あなたのコードが*ランダムに*動作するかもしれませんが、予期せず* –

答えて

5

"title"が前に来る場合メタデータに"album"がある場合、albumは決して初期化されません。 "album"がまったく存在しないことがあります。

トラックは以前"album""album"を定義していない次のトラックが前のトラックの値を使用します、次に定義されていた場合は、各トラックのalbumの値を空白ではないそうであるように。

各トラックに空白の値を付けます(それが妥当である場合)。 build_nameで値を見ると

は、文字列のリストなので、デフォルトでは['']次のようになります。

for sound_file in files: 
    artist = album = title = [''] 

メタデータは、故障している場合しかし、あなたはまだbuild_nameを呼び出す前の値を取得することはできません。

あなたはループの外build_name(artist, album, title)を移動する必要があります。

for (key, value) in metadata.items(): 
    ... # searching metadata 
build_name(artist, album, title) 
+0

ループの開始時に変数を空にしましたが、今は文字列にランダムな結果が出ています: ':w ['1967'] ['Prabhati'] ['1967'] ['1967'] ['Swara-Kakali'] ['1967'] ['ここで正しく表示されるわけではありませんが、4ではなく2つのフィールドがあります。時には4つのフィールドすべてがランダムに3つのフィールドになります – xavier

+1

@xavierまた変更する必要がありますインデント2つのインデントを取り除くことによって、 "build_name(アーティスト、アルバム、タイトル)"の上に表示されます。 Pythonの辞書は必ずしも反復可能な順序で反復されるとは限りません。これは、メタデータキー "title"が必ずしも最後ではないことを意味します。字下げを変更すると、build_name()が呼び出される前にアーティスト、アルバム、およびタイトルが適切に読み込まれるようになります。 – Stegrex

+1

@Stegrexはすでに完了しています(c: –

関連する問題