我觉得这是一个奇怪的请求。 我从字符串开始,然后通过处理字符串(多行)并返回列表的函数运行它。 此列表包含时间戳和文本。这是一个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_eval模块中的ast:
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
我可以在一个插件中执行此任务而不是另一个插件。但是在设计精神方面,我有一个完成工作的后端,以及绘制漂亮图片的前端。我更喜欢将工作保留在后端,并最大限度地减少前端部件上的加载模块和流程。
答案 0 :(得分: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
中没有。除非你能向我解释为什么会这样,否则我无法帮助你把它放回去。我想你可以搞清楚。
答案 1 :(得分:0)
不确定格式,但看起来你需要一对json.dumps
(将数据结构序列化为字符串,已经是你的)和json.loads
(完全相反)。并且在反序列化字符串后迭代并获取所需的键/值。
答案 2 :(得分:0)
我最初没有写这个函数,我不知道为什么作者使用了dbus.types。
所以,有两种解决方案:
正确使用json.dumps和json.loads,我没有这样做。
或者,删除dbus.types并使用标准的python类型 执行后者允许我使用str()和eval()进行转换,这是我首选的加载模块。
谢谢!