Abfrage SQlite Datenbank

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
BlackJack

@sveni_lee: Falsch daran ist, das diese Liste zu viele Wörterbücher enthält. Das sollte eigentlich auffallen. Oder der Quelltext den Du gezeigt hast, stimmt nicht mit dem überein, den Du tatsächlich verwendest.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

BlackJack hat geschrieben:@sveni_lee: Falsch daran ist, das diese Liste zu viele Wörterbücher enthält. Das sollte eigentlich auffallen. Oder der Quelltext den Du gezeigt hast, stimmt nicht mit dem überein, den Du tatsächlich verwendest.
ich bin mir nicht sicher was genau Du meinst...

Code: Alles auswählen

def refreshWidget(category, offset=0):

    listitems = []

    conn = sqlite3.connect(SerienPlaner)
    cur = conn.cursor()
    query = """SELECT %s
           FROM TVShowData
           WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) > julianday('now', 'localtime')
           %s
           ORDER BY StartTime
           LIMIT 15"""
    if category == __LS__(30116):
        filter = ""
        parameters = ()
    else:
        filter = " AND WatchType = ?"
        parameters = (category,)        

    query = query % (','.join(properties), filter)
    cur.execute(query, parameters)
    try:
        for idx, data in enumerate(cur, offset):
            for field, item in zip(properties, data):     
            
                WINDOW.setProperty('SerienPlaner.%d.%s' % (idx, field), item)
            
                listitems.append(dict(zip(properties, data)))          

        return listitems
    finally:
    
        cur.execute("""DELETE FROM TVShowData WHERE julianday(_Starttime) + (_RunningTime / 24.0 / 60.0) < julianday('now', 'localtime')""")
        conn.commit()
        conn.close()
fallsu Das Wörterbuch "properties" vermisst, das habe ich Global abgelegt, da ich es auch an anderen stellen verwende...

Code: Alles auswählen

properties = ['TVShow', 'Staffel', 'Episode', 'Title', 'Starttime', 'Datum', 'neueEpisode', 'Channel', 'Logo', 'PVRID', 'Description', 'Rating', 'Altersfreigabe', 'Genre', 'Studio', 'Status', 'Jahr', 'Thumb', 'FirstAired', 'RunningTime', 'Poster', 'WatchType']
BlackJack

@sveni_lee: `listitems` ist falsch. Das ist zu lang. Weil Du da zu viele Wörterbücher rein steckst. Und zwar 22 mal mehr als drin sein sollten. Für jeden Datensatz hängst Du jeweils 22 gleiche Wörterbücher an. Wie kann so etwas nicht auffallen‽
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

BlackJack hat geschrieben:Für jeden Datensatz hängst Du jeweils 22 gleiche Wörterbücher an
jetzt sehe bzw. verstehe ich was Du meinst...
BlackJack hat geschrieben:Wie kann so etwas nicht auffallen
weil ich mir nur den ersten und den letzt Datensatz angesehen habe...

gut ich benötige alle Werte aus properties mit den dazugehörigen Daten aus der SQL für jeden abgefragten Datensatz.
Ich wüsste nicht welches Wörterbuch ich da jetzt weg lassen kann...
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@sveni_lee: ich würde jeweils das letzte der 22 gleichen Wörterbücher behalten und die 21 davor weglassen.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

Sirius3 hat geschrieben:ich würde jeweils das letzte der 22 gleichen Wörterbücher behalten und die 21 davor weglassen.
bei listen kann man das mit [-1] machen aber irgendwie funktioniert das hier nicht so einfach
BlackJack

@sveni_lee: Ich weiss nicht was Du mit [-1] machen willst. Du musst ganz einfach nicht 22 mal das gleiche Wörterbuch für jeden Datensatz erzeugen und anhängen sondern das nur einmal für jeden Datensatz machen. Dazu muss man eigentlich nur Schleifen verstanden haben. Und wenn man Schleifen nicht versteht, wann da welcher Code wie oft ausgeführt wird, dann sollte man noch keine KODI-Plugins schreiben, sondern sich erst einmal die Grundlagen erarbeiten.

So ein KODI-Plugin mit all den komplexen Schnittstellen und den schlechten Möglichkeiten mit dem Code, den man entwickelt, zu experimentieren weil das alles innerhalb von einer grossen Anwendung in einem Plugin-Rahmenwerk passiert, wo Testläufe oder interaktive Shells nicht so einfach sind, ist IMHO kein guter Weg eine Programmiersprache oder Programmieren generell zu lernen. An der Stelle sollte man schon unfallfrei mit Schleifen und Grunddatenstrukturen wie Listen und Wörterbüchern operieren können, was Dir nach eigenen Angaben schwer fällt.

Zum Programmieren lernen ist es hilfreich ein Ziel zu haben, um die Motivation nicht zu verlieren. Aber wenn das Ziel, für den Anfang, etwas zu hoch gesteckt ist, sollte man schauen ob man sich auf dem Weg dorthin, nicht Zwischenziele setzen sollte, um den Frust zu vermeiden, der sich einstellen kann, wenn man das eigentliche Ziel nur sehr mühsam zusammen frickeln kann, aber letztendlich gar nicht richtig versteht was man da macht, oder warum da etwas funktioniert, oder eben auch nicht funktioniert.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

ich habe jetzt mal einen Debug eingebaut und nur einen Datensatz ausgeben lassen

Code: Alles auswählen

11:28:20 T:7432 DEBUG: [plugin.program.serienplaner 0.0.1]: zip(properties, data): {'neueEpisode': u'', 'Thumb': u'http://www.thetvdb.com/banners/episodes/164541/4178791.jpg', 'Title': u'Das rote Notizbuch', 'Jahr': u'2010', 'Staffel': u'2', 'TVShow': u'Hawaii Five-0', 'Channel': u'Fox HD', 'Status': u'Continuing', 'Description': u'Der Bergungstaucher Blake Spencer wird ermordet, und Steve bem\xfcht sich mit seinem Team um die Aufkl\xe4rung des Falles. Zuerst vermuten sie, dass Blake ein Wrack mit wertvollen Goldm\xfcnzen gefunden und sich damit in Gefahr gebracht hat. Doch die Wahrheit sieht ganz anders aus. W\xe4hrend der Ermittlungen lernt Danny Dr. Asano, eine Museumskuratorin, kennen. Sie gef\xe4llt ihm auf Anhieb, und er l\xe4sst sich von Steve dazu \xfcberreden, sie um ein Date zu bitten ...', 'Poster': u'http://thetvdb.com/banners/posters/164541-1.jpg', 'FirstAired': u'2011-10-10', 'Studio': u'CBS', 'Genre': u'Crime', 'Episode': u'4', 'Starttime': u'10:50', 'Altersfreigabe': u'TV-14', 'Rating': u'7.6', 'WatchType': u'Internationale Serien', 'Datum': u'13.04.2016', 'RunningTime': u'45', 'Logo': u'image://G%3a%5cKodi%5cSenderlogos%5cfox%20hd.png/', 'PVRID': u'36'}
11:28:20 T:7432 DEBUG: Previous line repeats 21 times.
der Datensatz wird 21x wiederholt. wenn ich nun nur den letzten satz haben möchte muß ich also den letzten key aus den dictionary
nehmen oder... danach habe ich in den Dokumentationen mal gesucht...
und das gefunden...

Code: Alles auswählen

dict.keys()[-1]
oder bin ich damit auf dem Holzweg?
BlackJack

@sveni_lee: Ja damit bist Du auf dem Holzweg. In der Liste sollten gar nicht erst zu viele Einträge hinzugefügt werden. Wenn Du da 22 mal das gleiche drin hast ist es schon zu spät, dazu sollte es erst gar nicht kommen. Und wenn jeder Eintrag nur einmal drin ist, gibt es auch keinen Grund irgendwas mit dem Index -1 machen zu wollen um einen der 22 Datensätze zu bekommen, denn dann gibt es den ja nur einmal und man muss gar nichts an der Liste im nachhinein verändern.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

also sollen in die Liste jeweils nur der erste Datensatz in die Liste eingetragen werden, richtig?

also irgendwas in der Art?

Code: Alles auswählen

(zip(properties, data)[0])
BlackJack

@sveni_lee: Da sieht man jetzt wieder das Du *kein Stück* verstanden hast was der Code tut den Du da von anderen übernommen hast. Programmieren durch raten funktioniert nicht!

Es sollte nicht nur das erste, oder das letzte, oder irgendein anderes der Wörterbücher an die Liste angehängt werden, denn diese 22 Wörterbücher pro Datensatz sollten überhaupt gar nicht existieren. Die gibt es gar nicht wenn man es richtig macht, folglich braucht man sich auch nicht für eines davon zu entscheiden.

Es sollte pro Datensatz genau ein Wörterbuch erzeugt und angehängt werden. Und das machst Du nicht. Du hängst nicht pro Datensatz eines an, sondern pro… Und das solltest Du selber wissen/herausfinden, denn solange Du das nicht verstanden hast, hast Du Schleifen und den Programmablauf nicht verstanden, und auf dieser fehlenden Grundlage kann man nicht programmieren. So kannst Du nur abschreiben, raten, rumprobieren, ohne zu verstehen was Du da tust, und auch ohne überhaupt sicher zu sein, dass Du ein robustes, fehlerfreies Programm schreibst. Denn selbst wenn etwas scheinbar funktioniert, kann es trotzdem noch Fehler haben. Sieht man hier ja sehr schön wie lange Du der Meinung warst das wäre alles in Ordnung und den Fehler nicht gesehen hast. Nicht mal an den Daten obwohl der schon im Code offensichtlich ist. Und zwar nicht nur offensichtlich für langjährige Programmierer, sondern auch für Anfänger die wissen wie so etwas grundlegendes wie Schleifen funktionieren/abgearbeitet werden.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

BlackJack hat geschrieben:@sveni_lee: Da sieht man jetzt wieder das Du *kein Stück* verstanden hast was der Code tut den Du da von anderen übernommen hast. Programmieren durch raten funktioniert nicht!
das hat nicht raten oder sonstigem zu tun... ich versuche diese sachen durch literatur und internet heraus zufinden. Leider werden dort aber nur "hallo Word" Geschichten betrachtet. Ich habe das letzte mal mir BASIC auf einem KC87/2 programiert falls Dir das noch etwas sagt! Das 87 steht für das JAhr in dem er vorgestellt wurde... nur mal nebenbei. Ich betrachte das ganze als Hobby und versuche anhand von bestehen codeteilen etwas nachzuvollziehen. Was mir zugegebener Maßen nicht ganz gelingt!
Es sollte nicht nur das erste, oder das letzte, oder irgendein anderes der Wörterbücher an die Liste angehängt werden, denn diese 22 Wörterbücher pro Datensatz sollten überhaupt gar nicht existieren. Die gibt es gar nicht wenn man es richtig macht, folglich braucht man sich auch nicht für eines davon zu entscheiden.
Das ist mir schon klar, ich war mir bis heute nicht bewusst, das das über haubt so passiert...
Es sollte pro Datensatz genau ein Wörterbuch erzeugt und angehängt werden. Und das machst Du nicht. Du hängst nicht pro Datensatz eines an, sondern pro…
ich denke du meinst hier ...Eintrag im der liste properties, das würde bedeuten, das schon diese Schleife

Code: Alles auswählen

for field, item in zip(properties, data):
nicht richtig ist... so wie es dar steht soll er für jedes (field, item) in meiner liste property einen Datensatz erzeugen...
er soll aber aber nur einen Datensatz für alle daten in properties erzeugen...
Und das solltest Du selber wissen/herausfinden, denn solange Du das nicht verstanden hast, hast Du Schleifen und den Programmablauf nicht verstanden, und auf dieser fehlenden Grundlage kann man nicht programmieren. So kannst Du nur abschreiben, raten, rumprobieren, ohne zu verstehen was Du da tust, und auch ohne überhaupt sicher zu sein, dass Du ein robustes, fehlerfreies Programm schreibst. Denn selbst wenn etwas scheinbar funktioniert, kann es trotzdem noch Fehler haben. Sieht man hier ja sehr schön wie lange Du der Meinung warst das wäre alles in Ordnung und den Fehler nicht gesehen hast. Nicht mal an den Daten obwohl der schon im Code offensichtlich ist. Und zwar nicht nur offensichtlich für langjährige Programmierer, sondern auch für Anfänger die wissen wie so etwas grundlegendes wie Schleifen funktionieren/abgearbeitet werden.

ich habe nie erwartet das mir der fehlende Code auf einem Tabett serviert wird aber wäre schon nett gewesen zu sagen, dass ich mir die schleife mal genauer ansehen sollte und wie oft dort Datensätze gebildet werden...

Auch auf die gefahr hin, das ich nun keine Antwort mehr bekomme und ich das Projekt "sterben" lassen muss. möchte ich trotzdem noch einiges loswerden:
Wenn ich meinen Kindern versuchen würde ihnen auf diese Weise etwas beizubringen oder zuverdeutlichen würde ich damit nur erreichen, das sie frustriert aufgeben! Damit hätte ich mein Ziel verpfehlt!
Es ist wichtig Sie auf die Fehler aufmeksam zumachen und das nicht in kryptischen äußerungen sondern ganz konkret ihnen zeigen an welcher stelle die Fehler sind und wo etwas falsch verstanden wurde...

Zurück zum Thema:

Ich habe mir die sache noch einmal angesehen, ich müsste eine dict aus ``field`` und ``item``bilden richtig? oder auch wieder flasch?
Sirius3
User
Beiträge: 17747
Registriert: Sonntag 21. Oktober 2012, 17:20

@sveni_lee: bei Deinen Kindern gehst Du hoffentlich auch davon aus, dass sie mit der Zeit einige Dinge selbständig erledigen können. Um bildlich zu bleiben, wenn sie ihre Jacke einfach liegen lassen, reicht ein "Jacke aufräumen" und man muß ihnen nicht zeigen, wo der Kleiderhaken ist.
for-Schleifen führen Dinge wiederholt aus. Wenn etwas zu oft ausgeführt wird, kann es vielleicht an einer for-Schleife liegen. Wenn Du weißt, was Deine for-Schleifen machen, ist auch klar, wie oft welches das Wörterbuch in der Liste landet. Bei einem Abschnitt, der aus 5 Zeilen besteht traue ich das beantworten dieser Frage auch einem Anfänger zu. Und über das dict aus field und item warst Du schon ganz am Anfang dieser Diskusion unglücklich.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

Naja, das mit dem Jacke aufräumen werden die beiden nie lernen... :P

Gut dann kann es ja nur an der Zweiten Schleife liegen... da wird für jedes item das eine Field aus der Liste hat ein kompletter Datensatz gebildet... Da ich 22 Werte in der Liste properties habe, werden dann wohl auch 22 Datensätze gebildet bis es zum nächsten idx aus der übergeordneten Schleife geht!

Die übergeordnete Schleife durchläuft ja nur die Anzahl der Ergebnisse aus der SQL Abfrage

Kommt das so hin?

Die SQL Abfrage ergibt ja eigendlich mehr als nur 22 Daten pro Datensatz...
BlackJack

@sveni_lee: Der KC87 konkret sagt mir nichts, aber das Jahr, 8-Bit-Rechner, und BASIC klingen sehr vertraut. Um die Zeit habe ich mit BASIC auf einem C64 angefangen. Ich habe im Netz ein Handbuch für das KC87-BASIC gefunden, und das sieht dem CBM BASIC recht ähnlich.

Ich denke ein wesentlicher Unterschied zwischen diesen BASIC-Dialekten und modernen Hochsprachen ist die Abstraktionsebene. Bei BASIC musste man sehr viel schreiben um eigentlich einfache Dinge zu erreichen, während moderne Programmiersprachen oft sehr ausdrucksstark sind, also bei wenig Code komplexe Dinge passieren. Das macht es schwieriger durch reines Anschauen, ohne nachzulesen und auszuprobieren, zu verstehen was Code macht. Und mit ausprobieren meine ich nicht wild herumprobieren, sondern sich zu überlegen was ein Ausdruck als Ergebnis hat, oder wie Code abgearbeitet wird und welche Effekte sich daraus ergeben, es dann ausführen und das Ergebnis mit der Erwartung vergleichen. Dann Änderungen ausprobieren, und dabei wieder vorher überlegen was hinten heraus kommen sollte. Und wenn die Erwartung nicht eintritt, dann überlegen warum das so ist.

Wie oft in den Schleifen Datensätze gebildet werden haben wir ja gesagt. Wenn jeder Datensatz 22 mal vorkommt, muss das ja irgendwo passieren, und wo wenn nicht in einer Schleife, denn Du hast da ja nicht 22 mal einen `append()`-Aufruf stehen.

Die SQL-Abfrage ergibt mehr als 22 Daten pro Datensatz? Wie das? Welche denn ausser den 22 Spaltennamen die in `properties` stehen denn noch?

Das mit dem `field` und `item` klang jetzt schon wieder geraten. Und wie man auf ``(zip(properties, data)[0])`` kommt, verstehe ich auch nicht, ausser wenn man nicht weisst was dieser Ausdruck bedeutet und was der Ausdruck ohne die Änderung von Dir bedeutet hat. Der Umgang mit Listen, Wörterbüchern, und Funktionen wie `zip()` ist wie schon gesagt *grundlegend*. So etwas braucht man in so ziemlich jedem Programm, darum solltest Du das echt erst einmal lernen. So ganz konkret mag Dir dabei niemand helfen weil es letztendlich darauf hinauslaufen würde Dir hier Texte von irgendwo anders abzutippen, denn die Grundlagen haben andere schon in Tutorials und Büchern aufgeschrieben. Unter anderem die Python-Entwickler selber in der Python-Dokumentation. Und das geht über "Hallo, Welt!" hinaus.

Alles was einem so über den Weg läuft was man nicht versteht, muss man dann nachlesen und sich erarbeiten, wenn man darüber stolpert. Du hättest Dir zum Beispiel zusätzlich zu den Grundlagen längst mal die `zip()`-Funktion und `dict()` anschauen müssen. Also die Dokumentation und dann mindestens in einer Python-Shell mal ein paar Beispiele ausprobieren müssen. Das sind Erfahrungen die Dir auch niemand anders abnehmen kann. Nur so lernt man mit diesen Werkzeugen umzugehen.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

BlackJack hat geschrieben: Die SQL-Abfrage ergibt mehr als 22 Daten pro Datensatz? Wie das? Welche denn ausser den 22 Spaltennamen die in `properties` stehen denn noch?
ich habe ja noch 3 weitere Felder eingefügt im datetime-format diese gebe ich aber nicht aus, da sie nur zur Berechnung dienen...
Das mit dem `field` und `item` klang jetzt schon wieder geraten.
ear es aber dieses mal nicht
ich habe mir die beiden werte mal in einem debug ausgeben lassen...
Alles was einem so über den Weg läuft was man nicht versteht, muss man dann nachlesen und sich erarbeiten, wenn man darüber stolpert. Du hättest Dir zum Beispiel zusätzlich zu den Grundlagen längst mal die `zip()`-Funktion und `dict()` anschauen müssen. Also die Dokumentation und dann mindestens in einer Python-Shell mal ein paar Beispiele ausprobieren müssen. Das sind Erfahrungen die Dir auch niemand anders abnehmen kann. Nur so lernt man mit diesen Werkzeugen umzugehen.
aber genau das mach ich doch... Ich lasse so gut wie alle Ausdrücke mal in einem debug anzeigen um zu sehen, wie diese aussehen...

bspw:

innerhalb der Schleife:

Code: Alles auswählen

writeLog('Anzeige field data: %s %s ' % (field, item), level=xbmc.LOGDEBUG)
Ausgabe

Code: Alles auswählen

15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: TVShow Peaky Blinders - Gangs of Birmingham
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Staffel 2
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Episode 6
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Title Das Attentat
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Starttime 15:00
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Datum 13.04.2016
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: neueEpisode
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Channel Sky Atlantic+1 HD
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Logo
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: PVRID 59
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Description Der Tag des Derbys in Epsom ist gekommen und Tommy Shelby soll nun die Abmachung mit Campbell einlösen. Tommy hat einen geheimen Plan und versammelt seine Gang bei dem berühmten Pferderennen in der Nähe von London.
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Rating 8.3
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Altersfreigabe TV-14
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Genre Crime | Drama
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Studio BBC Two
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Status Continuing
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Jahr 2013
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Thumb http://www.thetvdb.com/banners/episodes/270915/5008794.jpg
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: FirstAired 2014-11-06
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: RunningTime 60
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: Poster http://thetvdb.com/banners/posters/270915-7.jpg
15:59:55 T:6984 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige field data: WatchType Internationale Serien
von daher meine Idee eine Dict aus beiden werten zu erzeugen...

in der selben Schleife dann folgendes getestet:

Code: Alles auswählen

writeLog('Anzeige: %s ' % (zip(properties, data)), level=xbmc.LOGDEBUG)
Ausgabe:

Code: Alles auswählen

16:02:08 T:3976 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige: [('TVShow', u'Raumschiff Enterprise - Das n\xe4chste Jahrhundert'), ('Staffel', u'2'), ('Episode', u'13'), ('Title', u'Die Zukunft schweigt'), ('Starttime', u'15:08'), ('Datum', u'13.04.2016'), ('neueEpisode', u''), ('Channel', u'TELE 5 HD'), ('Logo', u'image://G%3a%5cKodi%5cSenderlogos%5ctele%205%20hd.png/'), ('PVRID', u'47'), ('Description', u'Die Enterprise holt ein havariertes Shuttle der Sternenflotte an Bord. Zu aller Erstaunen befindet sich ein bewusstloser Doppelg\xe4nger von Captain Picard in dem Schiff. Es stellt sich heraus, dass das Double aus der Zukunft stammt. Sein Logbuch berichtet von der Zerst\xf6rung der Enterprise.'), ('Rating', u'7.3'), ('Altersfreigabe', u'TV-PG'), ('Genre', u'Action | Adventure | Drama | Science-Fiction'), ('Studio', u'Syndicated'), ('Status', u'Ended'), ('Jahr', u'1987'), ('Thumb', u'http://www.thetvdb.com/banners/episodes/71470/46546.jpg'), ('FirstAired', u'1989-04-03'), ('RunningTime', u'57'), ('Poster', u'http://thetvdb.com/banners/posters/71470-5.jpg'), ('WatchType', u'Klassiker')]
16:02:08 T:3976 DEBUG: Previous line repeats 21 times.
und zu guterletzt das dict

Code: Alles auswählen

writeLog('Anzeige: %s ' % (dict(zip(properties, data))), level=xbmc.LOGDEBUG)
Anzeige:

Code: Alles auswählen

16:06:03 T:6664 DEBUG: [plugin.program.serienplaner 0.0.1]: Anzeige: {'neueEpisode': u'', 'Thumb': u'http://www.thetvdb.com/banners/episodes/78890/298277.jpg', 'Title': u'Verzweiflungstat', 'Jahr': u'2002', 'Staffel': u'1', 'TVShow': u'Spooks - Im Visier des MI5', 'Channel': u'AXN HD', 'Status': u'Ended', 'Description': u'US-Pr\xe4sident Bush wird zu einem Staatsbesuch in London erwartet, was auch eine gro\xdfe Anzahl von Globalisierungsgegnern in die Stadt zieht. Bei der Observation von Demonstranten f\xe4llt Danny und Zoe ein Mann auf, der hier eigentlich nichts zu suchen hat: Peter Salter geh\xf6rt zum MI-5. Harry Pearce kl\xe4rt seine verwunderten Agenten schlie\xdflich auf. Salter wurde in die linke Szene eingeschleust, um den Anarchistenf\xfchrer Istvan Vogel dingfest zu machen. Schon bald mehren sich allerdings die Hinweise, dass Salter die Seiten gewechselt hat ...', 'Poster': u'http://thetvdb.com/banners/posters/78890-5.jpg', 'FirstAired': u'2002-06-04', 'Studio': u'BBC One', 'Genre': u'Drama | Thriller', 'Episode': u'4', 'Starttime': u'15:10', 'Altersfreigabe': u'TV-MA', 'Rating': u'7.4', 'WatchType': u'Klassiker', 'Datum': u'13.04.2016', 'RunningTime': u'60', 'Logo': u'image://G%3a%5cKodi%5cSenderlogos%5caxn%20hd.png/', 'PVRID': u'16'}
16:06:03 T:6664 DEBUG: Previous line repeats 21 times.
Meine Erkenntniss daraus:

was macht zip: zip nimmt die inhalte aus meinem Liste ``properties`` und die dazugehörigen werte ``data`` aus der SQL-Abfrage und packt diese zusammen (darum auch zip wie ziooer oder reisverschluß)

was macht dict: dict bildet aus den in zip enthaltenen "Werte Paaren" ein Wörterbuch oder auch dictionary

was macht append: bildet wieder eine Liste aus den Wörterbüchern und hängt die an listitems an...

Ich versuche ja mich Schritt für Schritt der sache zu nähern... Ich glaube auch verstanden zuhaben warum das Progrmm das ganze 22x macht ABER ich habe im Moment noch keinen Lösungsansatz

Nebenbei: einen C64 und C128 hatte ich auch noch etwas später nachdem diese für mich zugänglich waren
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

also da hätte ich mir jetzt fast einen Wolf gesucht...

Der Fehler lag nicht in den Scheifen ansich, sondern in der ebene in der ich die Ausgabe eingbaut hatte.
Habe die Ausgabe ketzt in eine ebene höher also die über geordnete Schleige gepackt und schon ging es..

Im nachhinaein betrachtet ist das aber auch logisch... :K
BlackJack

Deine Beschreibung von `append()` ist falsch. Bildet eine Liste aus Wörterbüchern? Welche Wörterbücher?

Mit ausprobieren meine ich nicht in Deinem Programm und Ausgabe per Logging sondern ganz grundsätzlich mit irgendwelchen Beispieldaten *live* ausprobieren bis man es verstanden hat. So wirklich *ganz grundlegende* Sachen.

Code: Alles auswählen

In [1]: properties = ['a', 'b', 'c']

In [2]: data = [1, 2, 3]

In [3]: result = list()

In [4]: zip(properties, data)
Out[4]: [('a', 1), ('b', 2), ('c', 3)]

In [5]: dict(zip(properties, data))
Out[5]: {'a': 1, 'b': 2, 'c': 3}

In [6]: result.append(dict(zip(properties, data)))

In [7]: result
Out[7]: [{'a': 1, 'b': 2, 'c': 3}]
Wo hat `append()` da jetzt eine Liste gebildet und die an `result()` angehängt?

Erst wenn man `append()` mehrfach mit gleichem Argument aufruft wird auch mehrfach das gleiche Argument an die Liste angehängt. Womit wir wieder bei der ganz einfachen Lösung wären, die ich ja auch schon längst verraten hatte: Ruf `append()` nur einmal pro Datensatz auf und nicht mehrfach.
sveni_lee
User
Beiträge: 92
Registriert: Montag 14. März 2016, 09:50

ich habe nocheinmal eine kleine Frage :-)

könnte ich anstatt des ``returns listitems`` auch ein ``global listitems`` machen?
damit listitems global zu Verfügung stehen würde?
DasIch
User
Beiträge: 2718
Registriert: Montag 19. Mai 2008, 04:21
Wohnort: Berlin

sveni_lee hat geschrieben:könnte ich anstatt des ``returns listitems`` auch ein ``global listitems`` machen?
damit listitems global zu Verfügung stehen würde?
Könntest du machen aber der Code wäre halt dann schlecht.
Antworten