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()