2016-01-20 46 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: –