相关疑难解决方法(0)

ast.literal_eval vs json.dumps

我有一个字典作为字符串存储在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有效?一个比另一个好吗?

python parsing json abstract-syntax-tree

8
推荐指数
3
解决办法
4541
查看次数

将 JSON 从文件加载到 Python 字典的正确方法

我目前这样做是为了将 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 从文件中获取到字典中?

python json dictionary

5
推荐指数
1
解决办法
6479
查看次数

`ast.literal_eval` 的最快实现

我有一些文本(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

5
推荐指数
1
解决办法
2297
查看次数

python ast vs json for str to dict translation

我有一段代码接收格式化为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()相比?

谢谢

python json abstract-syntax-tree

3
推荐指数
1
解决办法
1446
查看次数

需要将字符串读入float数组

我有一个如下文本文件.我想将给定值读作浮点列表.之后我会做一些计算.我使用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)

python

3
推荐指数
1
解决办法
182
查看次数

将列表的字符串表示形式转换为列表

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]'

我可以遍历所有项目,并从第一个元素和最后一个元素中删除括号。但是,最佳和简单的方法是什么?

python string list

2
推荐指数
1
解决办法
2848
查看次数

标签 统计

python ×6

json ×3

abstract-syntax-tree ×2

dictionary ×1

list ×1

parsing ×1

string ×1