Debug:ValueError: malformed node or string

本文探讨了ValueError: malformed node or string在尝试使用ast.literal_eval处理字符串时的常见问题,解释了引发错误的原因,并介绍了eval与literal_eval之间的区别,以及如何避免此类错误并确保字符串安全转换。
部署运行你感兴趣的模型镜像

1.ValueError: malformed node or string

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

异常展示:

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 的区别详解_南淮北安的博客-优快云博客_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 的区别详解_南淮北安的博客-优快云博客_literal_eval python

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

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

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

### 错误原因 `raise ValueError('malformed node or string: ' + repr(node))` 错误通常在使用 `ast.literal_eval()` 函数时出现。该错误表示传入的字符串不是一个合法的 Python 字面量表达式,`ast.literal_eval()` 只能安全地计算由 Python 字面量(如字符串、数字、列表、元组、字典等)组成的表达式。 根据提供的引用,出现该错误的一个具体原因是对已经转换为 Python 类型的数据再次使用 `literal_eval`。例如,`df.col` 原本是字符串,使用 `df.col=df.col.apply(literal_eval)` 后,`df.col` 已经是指定类型的 Python 类型,若再次执行 `df.col=df.col.apply(literal_eval)`,就会因为 `df.col` 不是字符串而报错 [^2]。 ### 解决办法 - **检查输入数据类型**:确保传递给 `ast.literal_eval()` 的是字符串类型,并且该字符串是合法的 Python 字面量表达式。例如: ```python import ast try: data = '["apple", "banana", "cherry"]' result = ast.literal_eval(data) print(result) except ValueError as e: print(f"Error: {e}") ``` - **避免重复转换**:不要对已经转换为 Python 类型的数据再次使用 `ast.literal_eval()`。如果不确定数据是否已经转换,可以先检查数据类型 [^2]。 ```python import ast data = '["apple", "banana", "cherry"]' if isinstance(data, str): try: result = ast.literal_eval(data) print(result) except ValueError as e: print(f"Error: {e}") else: print("Data is already a Python object.") ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值