Debug:ValueError: malformed node or string

1.ValueError: malformed node or string

ValueError:错误的节点或字符串:

异常展示:

Debug:ValueError: malformed node or string_第1张图片

2.异常原因:

df.col=df.col.apply(literal_eval)

输入:字符串

输出:对应的标准的python数据格式

错误是应为:df.col是字符串,df.col=df.col.apply(literal_eval)后,df.col是已经转换成指定类型的python类型,又执行了一次,df.col=df.col.apply(literal_eval),这个时候df.col不是字符串了,故类型不正确,报错。

Python中函数 eval 和 ast.literal_eval 的区别详解_南淮北安的博客-CSDN博客_literal_eval python

def literal_eval(node_or_string):
    """
    Safely evaluate an expression node or a string containing a Python
    expression.  The string or node provided may only consist of the following
    Python literal structures: strings, bytes, numbers, tuples, lists, dicts,
    sets, booleans, and None.
    安全地计算包含Python的表达式节点或字符串表达式。提供的字符串或节点可能只包含以下内容Python文字结构:字符串,字节,数字,元组,列表,字典,
set、boolean和None。
    """
    if isinstance(node_or_string, str):
        node_or_string = parse(node_or_string, mode='eval')
    if isinstance(node_or_string, Expression):
        node_or_string = node_or_string.body
    def _convert(node):
        if isinstance(node, Constant):
            return node.value
        elif isinstance(node, (Str, Bytes)):
            return node.s
        elif isinstance(node, Num):
            return node.n
        elif isinstance(node, Tuple):
            return tuple(map(_convert, node.elts))
        elif isinstance(node, List):
            return list(map(_convert, node.elts))
        elif isinstance(node, Set):
            return set(map(_convert, node.elts))
        elif isinstance(node, Dict):
            return dict((_convert(k), _convert(v)) for k, v
                        in zip(node.keys, node.values))
        elif isinstance(node, NameConstant):
            return node.value
        elif isinstance(node, UnaryOp) and isinstance(node.op, (UAdd, USub)):
            operand = _convert(node.operand)
            if isinstance(operand, _NUM_TYPES):
                if isinstance(node.op, UAdd):
                    return + operand
                else:
                    return - operand
        elif isinstance(node, BinOp) and isinstance(node.op, (Add, Sub)):
            left = _convert(node.left)
            right = _convert(node.right)
            if isinstance(left, _NUM_TYPES) and isinstance(right, _NUM_TYPES):
                if isinstance(node.op, Add):
                    return left + right
                else:
                    return left - right
        raise ValueError('malformed node or string: ' + repr(node))
    return _convert(node_or_string)

​​​​​​Python中函数 eval 和 ast.literal_eval 的区别详解_南淮北安的博客-CSDN博客_literal_eval python

这个函数的作用:判断需要计算的内容计算后还是不是合法的python类型,如果是则进行计算,否则不进行计算。

 只会执行合法的python类型,对于字符串进行转换时,出于安全考虑最好使用这个方法。

你可能感兴趣的:(debug日常,debug)