2016-01-20 7 views
5

Ich programmiere ein kleines Skript, das Metadaten aus einer Audiodatei erhält und eine Zeichenfolge mit den gewünschten Werten erstellt. Ich weiß, dass ich etwas falsch mache, aber ich bin mir nicht sicher, warum, aber es ist wahrscheinlich die Art, wie ich die If's iteriere. Wenn ich den Code ausführen:Verstehen, warum dieser Python-Code nach dem Zufallsprinzip funktioniert

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]) 

ich das gewünschte Ergebnis oder einen Fehler, nach dem Zufall:

ERGEBNIS:

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

add 'album = ""' 'vor for' Schleife – Arman

+0

Wenn man sich die' if' Blöcke schauen Sie in Ihrem 'for' Schleifen, einige Iterationen ordnen 'album' zu; einige versuchen und benutzen 'album'. Wenn die Bedingungen, die zu dem Versuch führen, "Album" zu verwenden, vor den Bedingungen auftreten, die zur Zuweisung von "Album" führen, versuchen Sie, eine nicht zugewiesene Variable zu verwenden. – khelwood

+3

Da Sie nicht 'zufällig importieren' haben, würde ich überrascht sein, wenn Ihr Code * zufällig * funktioniert, obwohl es * unerwartet funktionieren könnte * –

Antwort

5

Wenn "title" kommt vor "album" in den Metadaten dann album wird nie initialisiert werden . "album" möglicherweise überhaupt nicht vorhanden.

Wie Sie tun nicht leer, um den Wert von album für jede Spur, wenn eine Spur "album" definiert vorher hatte dann den nächsten Titel, die nicht "album" nicht definiert wird der vorherige Titel Wert verwenden.

Geben Sie einen leeren Wert für jede Spur (wenn das für Sie sinnvoll ist).

Mit Blick auf build_name die Werte sind Listen von Strings, so sollte der Standard [''] sein:

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

Allerdings werden Sie noch keine Werte erhalten, bevor build_name aufrufen, wenn die Metadaten nicht in Ordnung ist.

Sie müssen build_name(artist, album, title) aus der Schleife bewegen:

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

Das Leeren der Variablen am Anfang der Schleife funktionierte, aber jetzt bekomme ich zufällige Ergebnisse auf der Zeichenkette: ': w Python3 ['1967'] ['Raga: Puriya Kalyan'] ['1967'] ['Swara-Kakali'] ['1967'] ['Prabhati'] ['1967'] ['Sonata N ° 3 a-Moll, op 25 '] 'Sie können hier wahrscheinlich nicht richtig sehen, aber es gibt nur zwei Felder statt 4, manchmal alle 4 Felder, manchmal 3, zufällig – xavier

+1

@xavier Sie müssen auch ändern das indentati auf "build_name (artist, album, title)" durch das Entfernen von 2 Einzügen. Wörterbücher in Python werden nicht notwendigerweise in wiederholbarer Reihenfolge wiederholt. Dies bedeutet, dass der Metadatenschlüssel "title" nicht immer zuletzt ist. Wenn Sie den Einzug ändern, bedeutet dies, dass der Interpret, das Album und der Titel ordnungsgemäß geladen werden, BEVOR build_name() aufgerufen wird. – Stegrex

+1

@Stegrex bereits getan (c: –

Verwandte Themen