"self Argument" entfernen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Mr Green Pepper
User
Beiträge: 5
Registriert: Sonntag 6. Januar 2019, 19:21

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

#.......

__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Bitte die volle Fehlermeldung posten. So kann man nur raten.
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

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()
    # ...
Mr Green Pepper
User
Beiträge: 5
Registriert: Sonntag 6. Januar 2019, 19:21

Hatte ich davor, gibt genau den selben Fehler aus ;_)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Den wir ja immer noch nicht sehen....
Mr Green Pepper
User
Beiträge: 5
Registriert: Sonntag 6. Januar 2019, 19:21

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)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
Sirius3
User
Beiträge: 18269
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

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)
Mr Green Pepper
User
Beiträge: 5
Registriert: Sonntag 6. Januar 2019, 19:21

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)
Zuletzt geändert von Mr Green Pepper am Montag 7. Januar 2019, 14:59, insgesamt 1-mal geändert.
Benutzeravatar
__blackjack__
User
Beiträge: 14040
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@__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.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Mr Green Pepper
User
Beiträge: 5
Registriert: Sonntag 6. Januar 2019, 19:21

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:
Antworten