【发布时间】:2017-10-25 13:40:08
【问题描述】:
我使用pprint.PrettyPrinter 将我的数据写入文件,并尝试使用ast.literal_eval 读取它。
这已经为我工作了很长一段时间,我对生成的文本表示相当满意。
但是,今天我在反序列化时遇到了这个错误:
File "/...mypath.../store.py", line 82, in <lambda>
reader=(lambda fd: ast.literal_eval(fd.read())),
File "/usr/lib64/python2.7/ast.py", line 80, in literal_eval
return _convert(node_or_string)
File "/usr/lib64/python2.7/ast.py", line 60, in _convert
return list(map(_convert, node.elts))
File "/usr/lib64/python2.7/ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "/usr/lib64/python2.7/ast.py", line 62, in <genexpr>
return dict((_convert(k), _convert(v)) for k, v
File "/usr/lib64/python2.7/ast.py", line 63, in _convert
in zip(node.keys, node.values))
File "/usr/lib64/python2.7/ast.py", line 62, in <genexpr>
return dict((_convert(k), _convert(v)) for k, v
File "/usr/lib64/python2.7/ast.py", line 79, in _convert
raise ValueError('malformed string')
ValueError: malformed string
如何修复这个特定文件?
有问题的文件是 17k 行/700kb。 我将它加载到 Emacs 中——括号是平衡的。 文件中没有非 ASCII 字符。 我可以“分而治之”(将文件分成两半并尝试真实每一半)——但这相当乏味。 有没有更好的?
我修改了ast.literal_eval:_convert 以打印有问题的节点 - 结果是<_ast.UnaryOp object at 0x110696510>。不是很有帮助。
如何确保以后不会发生这种情况?
我希望JSON 不是答案。 ;-)
我没有使用JSON,因为
【问题讨论】:
-
如果您能获得对违规节点的引用,请打印出其
lineno和col_offset属性 - 这应该可以告诉您问题的确切位置。 -
您能展示一个(简化的)文件示例吗?
-
@SergeBallesta 问题是关于试图找出文件中的问题所在。该文件的简化版本可能根本不会出现错误。
-
快速猜测,可能会也可能不会:在您的文件中搜索
set。ast.literal_eval无法处理空集。 -
@jasonharper:是的,做到了。谢谢!问题是我触发了一个已知的bug:
ast.literal_eval(str(float("inf")))(请将您的评论转换为答案,我很乐意接受)
标签: python python-2.7 serialization abstract-syntax-tree