Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用python对象查询文件 我有2个文件,我认为它们就像数据库的两个表。< /P> 他们为Python对象的每一行考虑一个字符串类型: {u'timestamp':1379941920.923155,u'code':u'xxx',u'code_id':u'xxx',u'greeting':u'xxx'}_Python_Arrays_Object - Fatal编程技术网

使用python对象查询文件 我有2个文件,我认为它们就像数据库的两个表。< /P> 他们为Python对象的每一行考虑一个字符串类型: {u'timestamp':1379941920.923155,u'code':u'xxx',u'code_id':u'xxx',u'greeting':u'xxx'}

使用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/”)},它会试图删除您的硬盘驱动器。(不要尝试这个!) 一个更安全的选

那么,我如何将它们转换成可以在python中使用和查询的东西呢。最佳情况下,我希望在“代码”键上交叉它们,但这是顺理成章的。首先,我需要将它们解析为python代码中的对象。

这些字符串看起来是python dicts的
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'}”
是您从打印Python
dict
repr()
以及创建相同
dict
的普通Python代码中获得的。完全不安全的方法是使用
eval()
,但这确实是你不应该做的。关于
eval()
的三条黄金法则是:

  • 不要用它
  • 不要用它
  • 仅限高级程序员:不要使用它
  • 现在你被警告了

    由于语法非常接近json,因此在对字符串进行一些简单的预处理后,您可以更安全地使用
    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打败了我,他的答案要好得多。