2016-12-29 7 views
0

これは奇妙な要求だと思います。 文字列で始まり、文字列を処理する関数(多くの行)を実行してリストを返します。 このリストにはタイムスタンプとテキストが含まれています。これはLRCファイルです(実際には歌詞付き)。文字列をリストに変換して戻す

私はいくつかのkodi(xmbc)モジュールを作成しています。独自のPythonインタプリタを実行しています。アドオン間でデータを共有することはできますが、文字列としてしか共有できません。 (kodiでプロパティとして設定する)

したがって、私はstr()で簡単に文字列に変換できるリストを持っていますが、扱うことができるリストに戻すことはできません。

いくつかの例のテキスト:

[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 

これはリストとしての私のパーサ関数から戻ってきました。生の形式では、次のようになります。

[{'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'}] 

これをstr()で文字列に変換すると、これは文字列として上記のようになります。

ここで、この文字列を元のリスト形式に戻したいと考えています。私はそれにラインプロセスによって行を行うには、私は事前に変換されたリストでできるように、要素を参照することができるように:私はいろいろなことを試してみた

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

、それを取り戻すように見えることはできません私はループすることができますリストに。

私は( '行' のリストである)json.dumpsを見て:

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

print newlines.__class__.__name__ 

しかし、これはラインがまだ "STR" あるので、私はevalをしてみましたと言われます:

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

しかし、evalのは、文字列の形式が好きではありません。

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

、私はを試してみました

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

しかし、それはさらに少ない私の文字列を気に入っ:astモジュールから。

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

このタスクは、1つのアドオンと他のアドオンで実行できます。しかし、デザインの精神で、私は仕事をするバックエンドと、美しい絵を描くフロントエンドを持っています。バックエンドで作業を続け、フロントエンドのモジュールやプロセスのロードを最小限に抑えることをお勧めします。

+2

なぜあなたは 'json.dumps'を2回していますか? –

+0

明らかに私が行ったすべてのテストを通して、それをjson.loadsに変更するのを忘れてしまったので動作します。どのようにそのことについて。 – jgauthier

+0

あなたの質問を編集し、最初は 'lines'にあるものを正確に表示してください。 – martineau

答えて

0

まあ、一般に、私はちょうど各行に別々に文字列書式を使用し、それらを改行で結合します。私はあなたがdbusについて何も知らないので、という機能を持って、dbus.Int64をあなたのタイムスタンプ形式に変換すると仮定します。

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

次に、"\n".join(from_parsed_line(line) for line in lines)を使用できます。

私が気づいたことの1つは、サンプルに<i>が最初の行に含まれていたが、解析されたデータにtextが含まれていなかったということです。それがなぜ私に説明できるのでなければ、私はそれをそこに戻すのを手助けすることはできません。私はあなたがそれを理解することができると仮定します。

0

フォーマットについてはわかりませんが、json.dumps(データ構造を既に文字列にシリアル化しています)とjson.loads(正確に反対のもの)のペアが必要です。また、文字列をデシリアライズした後に必要なキー/値を繰り返して取得します。

0

私はこの機能をもともと書いていませんでした。なぜ、その作者がdbus.typesを使ったのか分かりません。私はやっていませんでした正しく

使用json.dumpsとjson.loads、:

だから2つの解があります。

または、dbus.typesを削除し、標準のPythonタイプを使用してください。
後者を使うと、str()とeval()を使って変換することができました。

ありがとうございます!

関連する問題