我在DataFrame列中有几个字符串,看起来像这样,例如:
{'Free to Play': 17555, 'Multiplayer': 10499, 'FPS': 9248, 'Action': 8188, 'Shooter': 7857, 'Class-Based': 6098, 'Team-Based': 5363, 'Funny': 5155, 'First-Person': 4846, 'Trading': 4512, 'Cartoony': 4240, 'Competitive': 4116, 'Online Co-Op': 4016, 'Co-op': 3920, 'Robots': 3112, 'Comedy': 3049, 'Tactical': 2726, 'Crafting': 2491, 'Cartoon': 2450, 'Moddable': 2315}
我试图访问字典的键,但因为它仍然是一个字符串,我想把它转换成字典,发现人们说eval可以用于此。是的,当我这样尝试时,它工作得很好test_dict的类型是dict:
test_str = "{'Early Access': 77, 'RPG': 202}"
test_dict = eval(test_str)
但是当处理DataFrame中的字符串时
tags = main_data["tags"]
for taglist in tags:
taglist = """ + taglist + """
tag_dict = eval(taglist)
tag_dict始终保持为字符串,在某些字符串之后eval抛出如下错误:
File "<string>", line 1
"{'Action': 2681, 'FPS': 2048, 'Multiplayer': 1659, 'Shooter': 1420, 'Classic': 1344, 'Team-Based': 943, 'First-Person': 799, 'Competitive': 790, 'Tactical': 734, "1990's": 564, 'e-sports': 550, 'PvP': 480, 'Military': 367, 'Strategy': 329, 'Score Attack': 200, 'Survival': 192, 'Old School': 164, 'Assassin': 151, '1980s': 144, 'Violent': 40}"
^
SyntaxError: invalid syntax
我发现这可能是字符串长度的问题,因为当使用taglist = """"" + taglist + """""
eval时不会抛出任何错误,遍历所有字符串,但它们仍然没有转换为字典并保持str。
由于您要将字典序列化到某种外部存储,因此我将使用json。它是为此而设计的,而eval是。棘手。你实际上是在运行代码,所以不管别人往数据库里放什么,你都会运行它。
有一个问题。Json需要双引号。由于它已经以python代码的形式写入数据库,并且字典键周围带有单引号,因此您必须将其转换为双引号才能成为合法的json。我建议在数据库中修复它一次,然后使用json向前。
import json
data_dict = {'Free to Play': 17555, 'Multiplayer': 10499, 'FPS': 9248, 'Action': 8188, 'Shooter': 7857, 'Class-Based': 6098, 'Team-Based': 5363, 'Funny': 5155, 'First-Person': 4846, 'Trading': 4512, 'Cartoony': 4240, 'Competitive': 4116, 'Online Co-Op': 4016, 'Co-op': 3920, 'Robots': 3112, 'Comedy': 3049, 'Tactical': 2726, 'Crafting': 2491, 'Cartoon': 2450, 'Moddable': 2315}
data_dict.update({'Early Access': 77, 'RPG': 202})
data_string = json.dumps(data_dict)
# write it to a file or database
# read it later, we'll assume that's data_string
data_dict = json.loads(data_string)
print (data_dict['RPG'])
database_string = "{'Free to Play': 17555, 'Multiplayer': 10499, 'FPS': 9248, 'Action': 8188, 'Shooter': 7857, 'Class-Based': 6098, 'Team-Based': 5363, 'Funny': 5155, 'First-Person': 4846, 'Trading': 4512, 'Cartoony': 4240, 'Competitive': 4116, 'Online Co-Op': 4016, 'Co-op': 3920, 'Robots': 3112, 'Comedy': 3049, 'Tactical': 2726, 'Crafting': 2491, 'Cartoon': 2450, 'Moddable': 2315}"
# this isn't a general purpose converter, but works for this case
# just to change the single quotes to double quotes
converted_to_legal_json = database_string.replace("'", '"')
data_dict = json.loads(converted_to_legal_json)
print (data_dict['Multiplayer'])
如果你想的话,我可能会纠正你的eval,但是现在不能正确地做。但就像我说的,不推荐。出于安全考虑,我将使用ast.literal_eval而不是实际使用eval执行它。