使用python对象查询文件 我有2个文件,我认为它们就像数据库的两个表。< /P> 他们为Python对象的每一行考虑一个字符串类型: {u'timestamp':1379941920.923155,u'code':u'xxx',u'code_id':u'xxx',u'greeting':u'xxx'}
那么,我如何将它们转换成可以在python中使用和查询的东西呢。最佳情况下,我希望在“代码”键上交叉它们,但这是顺理成章的。首先,我需要将它们解析为python代码中的对象。这些字符串看起来是python dicts的使用python对象查询文件 我有2个文件,我认为它们就像数据库的两个表。< /P> 他们为Python对象的每一行考虑一个字符串类型: {u'timestamp':1379941920.923155,u'code':u'xxx',u'code_id':u'xxx',u'greeting':u'xxx'},python,arrays,object,Python,Arrays,Object,那么,我如何将它们转换成可以在python中使用和查询的东西呢。最佳情况下,我希望在“代码”键上交叉它们,但这是顺理成章的。首先,我需要将它们解析为python代码中的对象。这些字符串看起来是python dicts的reprs。反向或repr通常是eval,但对您不完全信任的数据使用eval可能是不明智的。这是因为,如果有人插入一行,如{u'code':uuu import_uuuu(“os”).system(“rm-Rf/”)},它会试图删除您的硬盘驱动器。(不要尝试这个!) 一个更安全的选
repr
s。反向或repr
通常是eval
,但对您不完全信任的数据使用eval
可能是不明智的。这是因为,如果有人插入一行,如{u'code':uuu import_uuuu(“os”).system(“rm-Rf/”)}
,它会试图删除您的硬盘驱动器。(不要尝试这个!)
一个更安全的选择是,它的工作原理类似于eval
,但只处理字符串、列表和字典等文本(而不是函数调用!)。因此,从文件中获取词典列表的基本函数是:
import ast
def read_dict_file(filename):
with open(filename) as f:
return [ast.literal_eval(line) for line in f]
至于对数据进行更多的处理,让您将其视为数据库,我认为这取决于您的数据集有多大,以及您想做的事情有多复杂
如果这是非常简单的东西,并且你没有很多数据,你可能可以通过键入任何相关字段的字典来做一些简单的事情,并得到合理的结果
另一方面,如果您想对数据进行更复杂的处理,或者如果您有很多数据,那么您可能应该将数据放在一个真实的数据库中,并使用它已经测试过的、可伸缩的API,而不是编写自己的API。Python附带了(可能还有一些我不熟悉的其他自包含数据库模块),因此即使您有相当大的需求,也可能不需要安装新软件。“{u'timestamp':1379941920.923155,u'code':u'xxx',u'code\u id':u'xxx',u'greeting':u'xxx'}”
是您从打印Pythondict
的repr()
以及创建相同dict
的普通Python代码中获得的。完全不安全的方法是使用eval()
,但这确实是你不应该做的。关于eval()
的三条黄金法则是:
json.loads()
:
import json
# your original line of text:
line = "{u'timestamp': 1379941920.923155, u'code': u'xxx', u'code_id': u'xxx', u'greeting': u'xxx'}\n"
# making it proper json, quick&dirty way, likely to break on some other examples,
# would need a proper regexp
line = line.replace("u'", "'").replace("'", '"')
# and now let's make it a python `dict`:
mydict = json.loads(line)
您可以使用json模块来转换它。@Naster:您试过了吗?这不是有效的json,它是Python的
repr()
,是一个带有unicode键和值的dict
(显然是Python 2.x)。Blckknght打败了我,他的答案要好得多。