【问题标题】:PYTHON : There is a function similar to ast.literal_eval ()?PYTHON:有没有类似ast.literal_eval()的函数?
【发布时间】:2015-04-21 13:55:18
【问题描述】:

我在使用 ast.literal_eval() 时遇到了问题。在下面的示例中,我只想将字符串 (myText) 转换为字典。但是 ast.literal_eval() 尝试评估 <__main__.myClass instance at 0x0000000052D64D88> 并给我一个错误。我完全理解这个错误,但我想知道是否有办法避免它(使用其他函数或使用函数 ast.literal_eval 的其他方式)

import ast

myText = "{<__main__.myClass instance at 0x0000000052D64D88>: value}"
ast.literal_eval(myText)

# Error: invalid syntax
# Traceback (most recent call last):
#   File "<maya console>", line 4, in <module>
#   File "C:\Program Files\Autodesk\Maya2016\bin\python27.zip\ast.py", line 49, in literal_eval
#     node_or_string = parse(node_or_string, mode='eval')
#   File "C:\Program Files\Autodesk\Maya2016\bin\python27.zip\ast.py", line 37, in parse
#     return compile(source, filename, mode, PyCF_ONLY_AST)
#   File "<unknown>", line 1
#     {<__main__.myClass instance at 0x0000000052D64D88>: value}
#      ^
# SyntaxError: invalid syntax # 

提前感谢您的帮助!

【问题讨论】:

  • 如果您知道myText 将相当正常,请考虑手动操作。 1 剥去牙套。 2. 以逗号分隔。 3. 在冒号上拆分每个结果字符串,然后将部分放入字典中。
  • 你想在这里发生什么?
  • 你了解ast.literal_eval 的作用吗?如果您的示例是逐字逐句的,那么字典表示中的键和值都不是实际文字。
  • 如果您将此类信息存储为字符串,您可能试图以错误的方式解决问题。你试图解决什么基本问题/你想评估这个字符串是什么?
  • 您的数据已经受到不可逆转的损坏。使用更智能的解析器无济于事。

标签: python


【解决方案1】:

您真正想做的是使用pickle.dump 转储您的数据并使用pickle.load(或等价物,例如json 等)加载它。使用repr(data)转储数据会出现这样的问题。

如果您只需要挽救已经生成的数据,您可能可以使用以下方法:

def my_literal_eval(s):
    s = re.sub(r"<__main__.myClass instance at 0x([^>]+)>", r'"<\1>"', s)
    dct = ast.literal_eval(s)
    return {myClass(): v for v in dct.itervalues()}

使用示例:

>>> import ast, re
>>> class myClass(object): pass
... 
>>> myText = "{<__main__.myClass instance at 0x0000000052D64D88>: {'name': 'theName'}, <__main__.myClass instance at 0x0000000052D73F48>: {'name': 'theName'}}"
>>> my_literal_eval(myText)
{<__main__.myClass object at 0x7fbdc00a4b90>: {'name': 'theName'}, <__main__.myClass object at 0x7fbdc0035550>: {'name': 'theName'}}

这仅在myClass 实例没有任何有用信息但仅用于标识时才有效。这个想法是首先通过将&lt;__main__.myClass instance ...&gt; 字符串替换为ast.literal_eval 可以解析的字符串来修复字符串,然后用实际的myClass 实例替换那些字符串——前提是这些可以不带参数构造,这取决于以上假设。

如果这个初始假设不成立,那么您的数据将像 Ignacio put it 一样受到不可逆转的损坏,再多的巧妙解析也无法找回丢失的位。

【讨论】:

  • 谢谢!它看起来非常适合我想做的事情!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 2014-09-09
  • 2020-11-04
相关资源
最近更新 更多