2016-01-20 67 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 

錯誤:

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'如果 – Arman

+0

你看看'if'在'for'循環塊,一些迭代將分配'專輯';有些嘗試使用「專輯」。如果導致嘗試使用「專輯」的條件發生在導致分配「專輯」的條件之前,那麼您嘗試使用未分配的變量。 – khelwood

+3

既然你沒有'隨機導入',我會感到驚訝,如果你的代碼工程*隨機*雖然它可能工作*意外* –

回答

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 !''python3 ['1967'] ['Raga:Puriya Kalyan'] ['1967'] ['Swara-Kakali'] ['1967'] ['Prabhati'] [''1967'] ['Sonata N °3在一個未成年人,op 25'] '你不可能在這裏看到正確的,但它只給了兩個領域,而不是4,有時所有4個領域,有時3,隨機 – xavier

+1

@xavier你也需要改變indentati通過刪除2個縮進來創建「build_name(藝術家,專輯,標題)」。 Python中的字典不一定以可重複的順序迭代。這意味着元數據鍵「標題」並不總是最後一個。更改縮進意味着將在調用build_name()之前正確加載藝術家,專輯和標題。 – Stegrex

+1

@Stegrex已經完成(c: –