2016-12-29 43 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> 

然后我试了literal_evalast模块:

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

但是,喜欢我的字符串甚至更少。

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

我可以在一个插件中执行此任务而不是其他插件。但是本着设计的精神,我有一个完成这项工作的后端,以及绘制漂亮照片的前端。我宁愿将工作保留在后端,并尽量减少在前端部分加载模块和进程。

+2

你为什么'json.dumps'ing两次? –

+0

因为显然通过我所有的测试,我忘了把它改成json.loads,它可以工作。那个怎么样。 – jgauthier

+0

请[编辑]你的问题,并确切地显示最初在'线路'中的内容。 – martineau

回答

0

那么,一般来说,我会在每一行分别使用字符串格式,然后用换行符将它们连接起来。我假设你有一些功能from_dbus_int64,将dbus.Int64变成你的时间戳格式,因为我对dbus一无所知。

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)

我注意到的一件事是您的示例在第一行中有<i>,但您的解析数据没有在text中。除非你能向我解释这是为什么,否则我不能帮你把它放回原处。我假设你可以弄明白。

0

不确定格式,但看起来像你需要一对json.dumps(将数据结构序列化为字符串,你已经)和json.loads(它完全相反)。在反序列化字符串之后迭代并获取所需的键/值。

0

我原本没写这个函数,也不知道作者为什么使用dbus.types。

因此,有两种解决方案:

使用json.dumps和json.loads正确,我没有做。

或者,删除dbus.types并使用标准的python类型。
做后者允许我使用str()和eval()进行转换,这是我首选的加载模块。

谢谢!

相关问题