Python将字符串转换为列表(No.split())

Python将字符串转换为列表(No.split()),python,django,string,list,Python,Django,String,List,我有个小问题: 我的数据库中有一个名为actions的字符串。 现在,我正在编写一个方法,从数据库中获取该字符串 (这很有效),然后我想把这个字符串转换成一个列表 我知道actions.split(),但这对我来说效果不太好,因为如果我的字符串如下所示: actions = [ {u'action': 'visit_testing', u'timestamp': datetime.datetime(2016, 2, 12, 13, 32, 14)}, {u'action': 'v

我有个小问题:


我的数据库中有一个名为
actions
的字符串。 现在,我正在编写一个方法,从数据库中获取该字符串 (这很有效),然后我想把这个字符串转换成一个列表

我知道
actions.split()
,但这对我来说效果不太好,因为如果我的字符串如下所示:

actions = [
    {u'action': 'visit_testing', u'timestamp': datetime.datetime(2016, 2, 12, 13, 32, 14)},
    {u'action': 'visit_foo', u'timestamp': datetime.datetime(2016, 2, 12, 13, 37, 50)}
]
我不能使用
actions.split(',')
,因为它会弄乱里面的字典

到目前为止,我有以下代码:

timestamp = datetime.now().replace(microsecond=0)
dict = {'timestamp': timestamp, 'action': action}

if self.actions:
    actions_string = str(self.actions)
    actions_stripped = actions_string.strip('[')
    actions_stripped = actions_stripped.strip(']')
    actions_splitted = actions_stripped.split(', ')

    new_action_list = []

    buffer = ''
     for string in actions_splitted:
        if '{' in string:
            buffer = str(string)
        elif '}' in string:
            buffer = buffer + ', ' + str(string)
            new_action_list.append(str(buffer))
            buffer = ''
        else:
            buffer = buffer + ', ' + str(string)
    self.actions = str(buffer)
    self.last_action = datetime.now().replace(microsecond=0)
    self.save()
else:
    self.actions = '['+str(dict)+']'
    self.last_action = datetime.now().replace(microsecond=0)
    self.save()
添加:如果我在
操作
为空时运行该方法,它会给我一个包含一个字典的列表,但是如果我在其中已经有内容时运行它,如果将操作设置为
,使用json库

import json
my_dict_or_list = json.loads(your_string)
然后使用Python对象。您将获得很多时间:-D

您应该使用来在数据库中存储有效的JSON。您可以使用
exec
从该字符串创建有效的
action
列表。但请注意,使用
exec
eval
可能是一种风险

输出

[{u'action': 'visit_testing', u'timestamp': datetime.datetime(2016, 2, 12, 13, 32, 14)}, {u'action': 'visit_foo', u'timestamp': datetime.datetime(2016, 2, 12, 13, 37, 50)}]
2016-02-12 13:32:14

我找到了一种适合我的方法:

    timestamp = datetime.datetime.now().replace(microsecond=0)

    if self.actions:
        new_dict = {"timestamp": timestamp, "action": action}
        #tmp_actions = json.loads(self.actions)
        tmp_actions = self.actions
        exec(tmp_actions)
        actions.append(new_dict)
        self.actions = str('actions = '+str(actions))
        self.last_action = datetime.datetime.now().replace(microsecond=0)
        self.save()
    else:
        exec('''actions = ['''+str({"timestamp": timestamp, "action": action})+''']''')
        self.actions = 'actions = '+str(actions)
        self.last_action = datetime.datetime.now().replace(microsecond=0)
        self.save()

谢谢您的帮助。

现在我得到了双引号中包含的属性名称:dict中的第1行第3列(char 2)json键用双引号括起来,而不是简单的引号。你能用这些引号来表示你的字符串吗?我试图更改这一行dict={“timestamp”:timestamp,“action”:action},但是引号被改回了单引号。。。我能做些什么吗。替换(“,”)?应该可以,但要注意带转义引号的字符串是你的命令(我不知道你是否可以有一些)为什么要在非json的东西上使用json.loads()?“我的数据库中有一个字符串。”“,将json作为字符串强制输入数据库,它可能需要是
JSONField
或实际的对象模型。这些代码总有一天会给您带来麻烦。想象一下如果有人在你的数据库中存储“os.system(“rm-rf”)”之类的东西会发生什么…@Brunodesshuilliers是的,我知道,但我想我可以写一个方法来检查文本是否“有效”(看是否有特定的格式)。就我而言,我不会把我的系统安全性押在这上面。说真的,您最好切换到(至少)json并为当前dat编写一个run once迁移脚本。或者使用一个适当规范化的关系模式,将“动作”存储在它们自己的表中,每个动作一行
    timestamp = datetime.datetime.now().replace(microsecond=0)

    if self.actions:
        new_dict = {"timestamp": timestamp, "action": action}
        #tmp_actions = json.loads(self.actions)
        tmp_actions = self.actions
        exec(tmp_actions)
        actions.append(new_dict)
        self.actions = str('actions = '+str(actions))
        self.last_action = datetime.datetime.now().replace(microsecond=0)
        self.save()
    else:
        exec('''actions = ['''+str({"timestamp": timestamp, "action": action})+''']''')
        self.actions = 'actions = '+str(actions)
        self.last_action = datetime.datetime.now().replace(microsecond=0)
        self.save()