Seite 1 von 1

"self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 13:37
von Mr Green Pepper
Hallo,

ich bin ein kompletter Python Anfänger, benötige es aber um Merkmale von Musikstücken automatisch aus zu lesen. Die passende Bibliothek habe ich mittlerweile eingebunden. Probleme habe ich noch dabei die mp3 Dateien automatisch ein zu lesen. Einen passenden Befehl um den Ordner aus zu lesen habe ich schon gefunden. Dieser speichert alles in einer Liste, möchte ich nun aber die Elemente der Liste einzeln einlesen bekomme ich immer die Fehlermeldung das ich 2 Positionsargumente übergeben hätte und nur 1 benötigt wird. Ich habe auch schon ein wenig gegoogelt und anscheinend hängt dies daran, dass außer dem Inhalt der Liste auch eine Referenz zu dem Objekt (Liste) weiter gegeben wird. Wie schaffe ich es also das nur der Inhalt der Liste weiter gegeben wird?
import essentia
import essentia.standard
import os


file = os.listdir()
i = 0

number = len(file)
print("Number:", number)

while i<= number:
if file.endswith(".mp3"):

print(file)

loader = essentia.standard.MonoLoader(file)

audio = loader()

#.......


Re: "self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 14:33
von __deets__
Bitte die volle Fehlermeldung posten. So kann man nur raten.

Re: "self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 14:34
von Sirius3
Bitte die Fehlermeldung mit dem kompletten Traceback hier posten, sonst weiß niemand, wo und welcher Fehler genau auftritt.
Statt über einen Index iteriert man per for-Schleife direkt über die Dateinamen:

Code: Alles auswählen

import essentia
import essentia.standard
from glob import glob

for filename in glob('*.mp3'):
    print(filename)
    loader = essentia.standard.MonoLoader(filename)
    audio = loader()
    # ...

Re: "self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 14:35
von Mr Green Pepper
Hatte ich davor, gibt genau den selben Fehler aus ;_)

Re: "self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 14:41
von __deets__
Den wir ja immer noch nicht sehen....

Re: "self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 14:42
von Mr Green Pepper
meint ihr das?

Exception has occurred: TypeError
__init__() takes 1 positional argument but 2 were given
File "/home/nox/MEGAsync/BArbeit/Essentia_try/test4.py", line 24, in <module>
loader = essentia.standard.MonoLoader(filename)

Re: "self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 14:46
von __deets__
Ja. Und da steht, dass der Konstruktor halt keine Datei uebergeben bekommt. Sondern du

loader = essentia.standard.MonoLoader()

machen musst. Wie man dem danach sagt, welche Datei er laden muss, steht auf einem anderen Blatt.

Das Beispiel, das ich gefunden habe ( https://essentia.upf.edu/documentation/ ... mples.html ), sagt:

audio = MonoLoader(filename='../../../test/audio/recorded/dubstep.flac')()

Aber da waere ich skeptisch, dass das funktioniert, weil ein keyword-Argument eigentlich automatisch positional sein sollte, wenn es uebergeben wird. Aber kannst du ja mal probieren.

Re: "self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 14:48
von Sirius3
Laut Dokumentation erwartet MonoLoader auch Keyword-Argumente:

Code: Alles auswählen

loader = essentia.standard.MonoLoader(filename=filename)
Dieses Forum soll aber kein "lies mir die Dokumentation vor"-Service sein.

Re: "self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 14:51
von __deets__
Ich hab's mal ausprobiert, und tatsaechlich geht das. Der Unterschied zu "normalem" Python scheint die C++-Wrapper-Geschichte zu sein.

Code: Alles auswählen

$ python3
Python 3.6.6 (default, Sep 12 2018, 18:26:19)
[GCC 8.0.1 20180414 (experimental) [trunk revision 259383]] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import essentia.standard
[   INFO   ] MusicExtractorSVM: no classifier models were configured by default
>>> path='/foo/bar/pluck-pcm16.wav'
>>> loader = essentia.standard.MonoLoader(filename=path)
>>> loader()
array([ 0.02808622,  0.07551964,  0.13664134, ..., -0.00040232,
        0.00132769,  0.0018424 ], dtype=float32)

Re: "self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 14:56
von Mr Green Pepper
loader = essentia.standard.MonoLoader(filename=filename)

Funktioniert vielen Dank, habe die Dokumentation auch gelesen. Bin wie gesagt ein kompletter Anfänger und wusste daher zum Beispiel nicht was genau ein Keyword Argument ist.
Und wenn ich den Pfad direkt rein geschrieben habe (wie im Beispiel der Dokumentation beschrieben), hat es ja auch funktioniert. Wieso also nicht wenn ich eine Variable rein schreibe die genau das selbe beinhaltet?

Außerdem verstehe ich nicht den Unterschied zwischen dem:

loader = essentia.standard.MonoLoader(filename=filename)

und dem

loader = essentia.standard.MonoLoader(filename)

Re: "self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 14:58
von __blackjack__
@__deets__: Die Signatur sieht so aus: ``def __init__(self, **kwargs):``. Man muss also alles als Schlüsselwortargumente übergeben.

Und Python 3 hätte selbst bei expliziten Schlüsselwortargumenten in der Signatur ja noch die Möglichkeit „keyword only“ für Schlüsselwortargumente zu erzwingen.

@Mr Green Pepper: Was Schlüsselwortargumente sind, wird in der Python-Dokumentation erklärt. Zum Beispiel in dem Grundlagentutorial das man dort findet, und mal durchgearbeitet haben sollte. Dann verstehst Du auch den Unterschied beim Aufruf.

Re: "self Argument" entfernen

Verfasst: Montag 7. Januar 2019, 15:01
von Mr Green Pepper
Vielen Dank soweit für eure schnelle Hilfe. Brauche Python eigentlich nur um die Merkmale aus zu lesen. Die Merkmale clustern tue ich dann vermutlich mit R. Hatte schon den Verdacht das es etwas Grundlegendes ist. Aber da ich überhaupt keine Ahnung von Python habe ist dann das Suchfeld sehr groß. Hatte schon angefangen mich mit dem "self-Ding" zu beschäftigen, und da ist es schon verdammt nett wenn es da ein paar erfahrene Leute gibt die einen zumindest sagen in welcher Ecke der Fehler liegt ;_)

Also vielen Dank nochmal :mrgreen: