我有一个字典作为字符串存储在db字段中.我试图将其解析成一个字典,但json.loads给了我一个错误.
>>> c.iframe_data
u"{u'person': u'Annabelle!', u'csrfmiddlewaretoken': u'wTE9RZGvjCh9RCL00pLloxOYZItQ98JN'}"
# json fails
>>> json.loads(c.iframe_data)
Traceback (most recent call last):
ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
# ast.literal_eval works
>>> ast.literal_eval(c.iframe_data)
{u'person': u'Annabelle!', u'csrfmiddlewaretoken': u'wTE9RZGvjCh9RCL00pLloxOYZItQ98JN'}
Run Code Online (Sandbox Code Playgroud)
为什么json失败并且ast.literal_eval有效?一个比另一个好吗?
我目前这样做是为了将 JSON 保存到文件中:
with open(filename, 'w+') as f:
json.dump(data, f)
Run Code Online (Sandbox Code Playgroud)
我这样做是为了将文件中的 JSON 加载到 Python 字典中:
with open(filename, 'r') as f:
data = json.loads(json.load(f))
Run Code Online (Sandbox Code Playgroud)
我知道json.load从文件json.loads加载 JSON 并从字符串加载 JSON。
当我调用json.load(f)从文件加载 JSON 时,我得到了 JSON 对象的字符串表示:
'{"a": 1,"b": 2,"c": 3}'
Run Code Online (Sandbox Code Playgroud)
然后我调用json.loads(json.load(f))将该字符串表示形式转换为 Python 字典:
{'a': 1, 'b': 2, 'c': 3}
Run Code Online (Sandbox Code Playgroud)
我知道我也可以ast.literal_eval()用来将字符串转换为 Python 字典。
我的问题是 - 将 JSON 从文件目录加载到 Python 字典的正确方法是什么?是否真的有必要同时调用两者json.loads并将json.loadJSON 从文件中获取到字典中?
我有一些文本(str, bytes; 实际上压缩在磁盘上的文件中),可以通过ast.literal_eval.
(它由一个字典列表组成,其中字典键是字符串,值是字符串、int 或 float。但也许这个问题对于任何可以通过 解析的字符串都是通用的ast.literal_eval。)
它很大:未压缩时约为 22MB。
解析它的最快方法是什么?
我当然可以使用ast.literal_eval,但这看起来很慢。标准eval稍微快一些(有趣的是,但可能正如预期的那样,取决于您对 Python 的了解程度;请参阅 的实现ast.literal_eval),但仍然很慢。
相比之下,当我将相同的数据序列化为 JSON,然后加载 JSON ( json.loads) 时,速度要快得多(>10 倍)。所以这表明原则上应该可以同样快地解析它。
一些统计数据:
Gunzip + read time: 0.15111494064331055
Size: 22035943
compile: 3.1023156170000004
parse: 3.3381092380000004
eval: 3.0252232049999996
ast.literal_eval: 3.765798232
json.loads: 0.2657175249999994
Run Code Online (Sandbox Code Playgroud)
可以找到此基准测试脚本以及生成此类虚拟文本文件的脚本:此处
(也许答案是:“这需要更快的 C 实现;目前还没有人实现过”)
好吧,发完这篇文章后,我发现了一些相关的问题。不过我没有通过谷歌找到它们(也许我的搜索词“fasterliteral_eval”不好)。
这部分回答了这个问题。
我有一段代码接收格式化为python字典的字符串
"{'a':'1','b':'2',...}"
Run Code Online (Sandbox Code Playgroud)
我需要转换为正确的字典.
我尝试了两种方法,使用json.loads(s)和ast.literal_eval(s)
ast似乎更健壮,接受字符串中的任何形式的引号和"只是工作",而json似乎对引用细节非常挑剔,并且不会仅在单个表单上失败报价格式.我真的希望尽可能灵活地使用输入,因此更喜欢使用ast,但是,我的一些同事声称它可能不是一个"安全"的模块和功能.
任何人都可以建议ast和ast.literal_eval()安全,特别是与json.loads()相比?
谢谢
我有一个如下文本文件.我想将给定值读作浮点列表.之后我会做一些计算.我使用split函数和convertion来浮动.但我无法转换第一个和最后一个,因为这两个方括号.([]).它给出了如下错误.
文件格式
[-1.504, 1.521, 1.531, 1.1579, -2.2976, 2.5927,... 1000 records]
[2.758, -0.951, -1.7952, 0.4255, 2.5403, 1.0233,... 1000 records]
[0.682, -2.205, 2.1981, 2.1329, 0.1574, -0.4695,... 1000 records]
Run Code Online (Sandbox Code Playgroud)
错误
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueError: could not convert string to float: [0.682
Run Code Online (Sandbox Code Playgroud)
我用的代码
F = open('XYZ.txt', 'r')
>>> for line in F:
... P = line.split(',')
... P
Run Code Online (Sandbox Code Playgroud)
任何人都可以给我一个想法如何将这些值读入浮点数组,如下所示.
X = [-1.504, 1.521, 1.531, 1.1579, -2.2976, 2.5927,... 1000 records]
Y = [2.758, -0.951, -1.7952, 0.4255, 2.5403, …Run Code Online (Sandbox Code Playgroud) list_string = "[1,3,4,6]"
Run Code Online (Sandbox Code Playgroud)
我试过了,list_string[1:-1]但是给了1,3,4,6。我也尝试过,list_string.split(',')但再次将括号添加到第一个和最后一个元素,即'[1' , '3' , '4' , '6]'
我可以遍历所有项目,并从第一个元素和最后一个元素中删除括号。但是,最佳和简单的方法是什么?