2016-12-29 7 views
0

Ich fühle mich wie dies eine seltsame Anfrage ist. Ich beginne mit einer Zeichenfolge, und dann führe ich das durch eine Funktion, die die Zeichenfolge (viele Zeilen) verarbeitet und eine Liste zurückgibt. Diese Liste enthält Zeitstempel und Text. Es ist eine LRC-Datei, eigentlich (Lyric mit Track-Zeit)Konvertieren Sie eine Zeichenfolge in eine Liste und zurück

Ich schreibe ein paar Kodi (xmbc) -Module, und es läuft ein eigener Python-Interpreter. Ich kann Daten zwischen Addons aber nur als Zeichenketten teilen. (Setzen sie als eine Eigenschaft in Kodi)

So habe ich eine Liste, die ich leicht in eine Zeichenfolge mit str() konvertieren kann, aber ich kann es nicht zurück in die gleiche Liste, die ich damit umgehen kann.

Einige Beispieltext:

[01:45.17]<i>I cant remember anything 
[01:48.80]Cant tell if this is true or dream 
[01:52.29]Deep down inside I feel to scream 
[01:55.91]This terrible silence stops me 

Das kommt von meiner Parserfunktion als Liste. In Rohform wie folgt aussieht:

[{'timestamp': dbus.Int64(105170L), 'id': dbus.UInt32(0L), 'text': 'I cant remember anything'}, {'timestamp': dbus.Int64(108800L), 'id': dbus.UInt32(1L), 'text': 'Cant tell if this is true or dream'}, {'timestamp': dbus.Int64(112290L), 'id': dbus.UInt32(2L), 'text': 'Deep down inside I feel to scream'}, {'timestamp': dbus.Int64(115910L), 'id': dbus.UInt32(3L), 'text': 'This terrible silence stops me'}] 

Sobald ich dies in einen String mit str konvertieren() es sieht genauso aus wie das, was als String ist oben.

Jetzt möchte ich diese Zeichenfolge zurück in die ursprüngliche Listenform erhalten. Damit ich durch die Linie Prozesse auf sie tun Linie können, und die Elemente verweisen, wie ich mit der bereits konvertierte Liste kann:

print line['text'] 
print line['timestamp'] 

ich verschiedene Dinge ausprobiert habe, aber kann nicht scheinen, um es zu bekommen zurück in eine Liste, die ich durchlaufen kann.

ich json.dumps sah ('Linien' ist die Liste):

lines_str=json.dumps(lines) 
newlines=json.dumps(lines_str) 

print newlines.__class__.__name__ 

Aber das sagt mir, dass Linien ist immer noch ein "str" ​​ Also habe ich versucht, mit eval:

lines_str=str(lines) 
newlines=eval(lines_str) 
hat

Aber eval nicht das String-Format mag:

Traceback (most recent call last): 
    File "./l.py", line 33, in <module> 
    newlines=eval(lines_str) 
    File "<string>", line 1, in <module> 

dann habe ich versucht literal_eval vom ast Modul:

lines_str=str(lines) 
newlines=ast.literal_eval(lines_str) 

Aber das mochte meine Schnur noch weniger.

File "/usr/lib/python2.7/ast.py", line 79, in _convert 
    raise ValueError('malformed string') 
ValueError: malformed string 

Ich könnte diese Aufgabe in einem Addon gegenüber dem anderen durchführen. Aber im Geiste des Designs habe ich ein Backend, das die Arbeit macht, und das Frontend, das die schönen Bilder malt. Ich würde es vorziehen, die Arbeit am Backend zu behalten und Lademodule und Prozesse am Frontend zu minimieren.

+2

Warum sind Sie 'json.dumps' zweimal? –

+0

Weil ich anscheinend bei all meinen Tests vergessen habe, das zu json.loads zu ändern, was funktioniert. Wie ist es damit. – jgauthier

+0

Bitte bearbeiten Sie Ihre Frage und zeigen Sie genau an, was sich ursprünglich in "Zeilen" befindet. – martineau

Antwort

0

Nun, im Allgemeinen würde ich nur Zeichenfolge Formatierung für jede Zeile separat verwenden, und dann verbinden Sie sie mit Zeilenumbrüchen. Ich nehme an, Sie haben eine Funktion from_dbus_int64, die eine dbus.Int64 in Ihr Timestamp-Format verwandelt, da ich nichts über dbus weiß.

def from_parsed_line(line): 
    return "{timestamp}{text}".format(
     timestamp=from_dbus_int64(line["timestamp"]), 
     text=line["text"] 
    ) 

Dann könnten Sie einfach "\n".join(from_parsed_line(line) for line in lines) verwenden.

Eine Sache, die ich bemerkte, ist, dass Ihre Probe <i> in der ersten Zeile hatte, aber Ihre geparsten Daten hatten es nicht in der text. Wenn Sie mir nicht erklären können, warum das so ist, kann ich Ihnen nicht helfen, das wieder da hinein zu legen. Ich nehme an, Sie können es herausfinden.

0

Nicht sicher über Format, aber sieht aus wie Sie brauchen (serialisiert Datenstruktur zu Zeichenfolge, die Sie bereits haben) und json.loads (die genau entgegengesetzt). Iterieren und erhalten Sie Schlüssel/Werte, die Sie nach dem Deserialisieren Ihrer Strings benötigen.

0

Ich habe diese Funktion ursprünglich nicht geschrieben, und ich weiß nicht, warum der Autor dbus.types verwendet hat.

So gibt es zwei Lösungen:

Verwenden json.dumps und json.loads richtig, was ich nicht tat.

Oder entfernen Sie die dbus.types und verwendet Standard-Python-Typen.
Doing letzteres erlaubt mir, mit str() und eval() zu konvertieren, was ich gegenüber dem Laden von Modulen bevorzugt.

Danke!

Verwandte Themen