Fehler beim vergleichen

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
pimp1310
User
Beiträge: 2
Registriert: Montag 11. Mai 2020, 08:38

Hallo,

ich vergleiche eine liste mit meinem Suchbegriff, doch wenn der Suchbegriff eine zahl enthält kriege ich folgenden error

Code: Alles auswählen

UnicodeWarning: Unicode equal comparison failed to convert both arguments to Unicode - interpreting them as being unequal
ich denke das liegt daran das sie in verschiedene formate miteinander vergleiche,"jsonobject" ist ja bereits in utf8 formatiert, ich kriege aber den searchstring nicht formatiert, bzw weiss nicht genau wie ich damit umgehen muss.

Code: Alles auswählen

if (__name__ == '__main__'):
    searchstring = None
    try:
        params = dict(arg.split('=') for arg in sys.argv[ 1 ].split('&'))
    except:
        params = {}    
    searchstring = params.get('searchstring','')
    searchstring = urllib.unquote_plus(searchstring)
    searchstring = searchstring.replace('eins', '1')
    searchstring = searchstring.replace('two', '2')
    searchstring = searchstring.replace('drei', '3')
   

json_response = xbmc.executeJSONRPC('{"jsonrpc": "2.0", "method": "VideoLibrary.GetMovies", "id": "1"}') 
jsonobject = json.loads(json_response.decode('utf-8','replace'))   
Min =jsonobject['result']['limits']['start']
Max=jsonobject['result']['limits']['end']

for i in range(Min,Max):
    Filename=jsonobject['result']['movies'][i]['label']
    Filename = Filename.replace('-', '')
    if(Filename.lower()==searchstring):
        NewValue = jsonobject['result']['movies'][i]['movieid']
        print jsonobject['result']['movies'][i]['movieid']
        xbmc.executeJSONRPC('{\"jsonrpc\":\"2.0\",\"method\":\"Player.Open\",\"params\":{\"item\":{\"movieid\":' + str(NewValue) + '}},\"id\":\"1\"}') 
        break
wäre für einen Denkanstoß dankbar
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Die Klammern bei if sind überflüssig. if ist ja keine Funktion.
Keine nakten except: welche Exception erwartest Du denn konkret? Wäre es dann nicht besser, dem Nutzer eine Sinnvolle Meldung zu geben, statt einfach mit enem leeren params weiter zu machen?
Dann landet ab json_reponse plötzlich wieder alles auf oberster Ebene, das sollte wohl auch eingerückt sein.
Und dann schau mal nach, welchen Typ Du tatsächlich hast.
Die vielen \ in \" sind allesamt überflüssig und machen das lesen nur schwierig. Statt einen String zusammenzustückeln, solltest du json.dumps benutzen.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pimp1310: Die erste Zuweisung an `searchstring` wird nirgends verwendet, kann also weg.

Dann sieht das was Du bei `params` versuchst aus wie ein Job für `urlparse.parse_qsl()`.

Eine JSON-Antwort muss man nicht in eine Zeichenkette umwandeln, die kann man direkt an `json.loads()` übergeben.

Es wäre übersichtlicher wenn da nicht immer wieder so tief in dieses `jsonobject` hinein gegriffen würde. Alle Zugriffe darauf fangen mit ``["result"]`` an, das kann man zum Beispiel einmal am Anfang machen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). `min` und `max` geht aber auch nicht wirklich, weil man damit die gleichnamigen, eingebauten Funktionen überschreibt. Allerdings heissen die Werte im JSON-Objekt aber auch `start` und `end`, also warum dann umbenennen. Oder warum überhaupt an einen extra Namen binden, da beide Werte nur einmal verwendet werden.

Die Indirektion über einen Laufindex kann man sich aber auch ganz sparen wenn man den enstprechenden Teil aus dem Ergebnis einfach ”slice”t.

Da beide RPC-Aufrufe Gemeinsamkeiten haben, sollte man die in eine Funktion herausziehen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import absolute_import, division, print_function

import json
import sys
import urlparse

import xbmc


def do_rpc_call(method, params=None, id_="1"):
    json_object = {"jsonrpc": "2.0", "method": method, "id": id_}
    if params is not None:
        json_object["params"] = params
    return json.loads(xbmc.executeJSONRPC(json.dumps(json_object)))["result"]


def main():
    params = dict(urlparse.parse_qsl(sys.argv[1].decode("utf-8")))
    searchstring = params.get("searchstring", "")
    for old, new in [("eins", "1"), ("two", "2"), ("drei", "3")]:
        searchstring = searchstring.replace(old, new)

    result = do_rpc_call("VideoLibrary.GetMovies")
    limits = result["limits"]
    for movie in result["movies"][limits["start"] : limits["end"]]:
        if movie["label"].replace("-", "").lower() == searchstring:
            do_rpc_call("Player.Open", {"item": {"movieid": movie["movieid"]}})
            break


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
pimp1310
User
Beiträge: 2
Registriert: Montag 11. Mai 2020, 08:38

__blackjack__ hat geschrieben: Montag 11. Mai 2020, 13:26 @pimp1310: Die erste Zuweisung an `searchstring` wird nirgends verwendet, kann also weg.

Dann sieht das was Du bei `params` versuchst aus wie ein Job für `urlparse.parse_qsl()`.

Eine JSON-Antwort muss man nicht in eine Zeichenkette umwandeln, die kann man direkt an `json.loads()` übergeben.

Es wäre übersichtlicher wenn da nicht immer wieder so tief in dieses `jsonobject` hinein gegriffen würde. Alle Zugriffe darauf fangen mit ``["result"]`` an, das kann man zum Beispiel einmal am Anfang machen.

Namen werden in Python klein_mit_unterstrichen geschrieben. Ausnahmen sind Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). `min` und `max` geht aber auch nicht wirklich, weil man damit die gleichnamigen, eingebauten Funktionen überschreibt. Allerdings heissen die Werte im JSON-Objekt aber auch `start` und `end`, also warum dann umbenennen. Oder warum überhaupt an einen extra Namen binden, da beide Werte nur einmal verwendet werden.

Die Indirektion über einen Laufindex kann man sich aber auch ganz sparen wenn man den enstprechenden Teil aus dem Ergebnis einfach ”slice”t.

Da beide RPC-Aufrufe Gemeinsamkeiten haben, sollte man die in eine Funktion herausziehen.

Ungetestet:

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import absolute_import, division, print_function

import json
import sys
import urlparse

import xbmc


def do_rpc_call(method, params=None, id_="1"):
    json_object = {"jsonrpc": "2.0", "method": method, "id": id_}
    if params is not None:
        json_object["params"] = params
    return json.loads(xbmc.executeJSONRPC(json.dumps(json_object)))["result"]


def main():
    params = dict(urlparse.parse_qsl(sys.argv[1].decode("utf-8")))
    searchstring = params.get("searchstring", "")
    for old, new in [("eins", "1"), ("two", "2"), ("drei", "3")]:
        searchstring = searchstring.replace(old, new)

    result = do_rpc_call("VideoLibrary.GetMovies")
    limits = result["limits"]
    for movie in result["movies"][limits["start"] : limits["end"]]:
        if movie["label"].replace("-", "").lower() == searchstring:
            do_rpc_call("Player.Open", {"item": {"movieid": movie["movieid"]}})
            break


if __name__ == "__main__":
    main()
okay, ich versuche das gerade mal nachzuvollziehen, ist für mich als Anfänger viel, aber ich google mich mal durch, beim testen ist mir aufgefallen das ich noch die : entfernen müsste, wie erweitere ich denn das "if movie["label"].replace("-", "").lower() == searchstring:" um das zusätzliche entfernen der ":" (doppelpunkte)?

vielen dank
Antworten