将字符串转换为列表并返回

时间:2016-12-29 22:16:42

标签: python string list type-conversion string-conversion

我觉得这是一个奇怪的请求。 我从字符串开始,然后通过处理字符串(多行)并返回列表的函数运行它。 此列表包含时间戳和文本。这是一个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

我可以在一个插件中执行此任务而不是另一个插件。但是在设计精神方面,我有一个完成工作的后端,以及绘制漂亮图片的前端。我更喜欢将工作保留在后端,并最大限度地减少前端部件上的加载模块和流程。

3 个答案:

答案 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()进行转换,这是我首选的加载模块。

谢谢!