python读取MySQL数据表时,使用ast模块转换decimal格式数据的坑

本文探讨了Python中使用ast.literal_eval()与eval()进行数据类型转换的差异,特别是在处理Decimal类型时的问题。通过实例演示了如何避免常见错误,并推荐在特定场景下使用eval()。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

MySQL中常用的数据格式有tinyint()、int()、float()、double()、decimal() 、varchar、enum()、datetime;小数格式中decimal比较常用,因为更加精确,这里就以decimal为例。
从MySQL中读取了一行数据,内容为:(17479, datetime.datetime(2020, 4, 1, 0, 0), Decimal('23646.00'), Decimal('23646.00'), Decimal('23622.00'),因为需要通过TCP传递给用户,所以把数据转换为字符串,用户端接收到数据后,需要再把字符串还原,还原字符串常用模块ast,例如:ast.literal_evel(),这里就遇到坑了,直接使用ast.literal_evel()会报错,报错的原因呢,就是Decimal(‘23646.00’)这种格式ast模块不认识。

解决方案

首先,Decimal 是decimal模块的一个类,那么先导入。与ast.literal_evel()类似的功能还有一个evel(),直接使用evel()还原数据就不会出问题,这是为什么呢?

evel()与ast.literal_evel()的区别

eval()在做数据转换前并不知道需要转化的数据是否合法的python数据类型。只是在调用函数的时候去计算。如果被计算的内容不是合法的python类型就会抛出异常。而ast.literal_evel()会先判断需要转换的内容是不是合法的python数据类型,如果是则进行转换,否则就不进行转换。因此,平时还是推荐使用ast.literal_eval()
但是遇到了Decimal(‘23646.00’)事件,为省事期间还是直接使用eval()吧。
简单的示例:

from decimal import *
import pandas
abc = ((17479, datetime.datetime(2020, 4, 1, 0, 0), Decimal('23646.00'), Decimal('23646.00'), Decimal('23622.00'), Decimal('23624.00'), 74, 100, 0),(30029, datetime.datetime(2020, 4, 25, 0, 58), Decimal('23926.00'), Decimal('23948.00'), Decimal('23926.00'), Decimal('23946.00'), 38, 20, 0))
abc = repr(abc)
abc = eval(abc)
print(abc)

ast模块的注意事项

ast官方文档
ast模块的比较常用的两个方法parse和literal_evel,从官方文档可以看到这两个方法都有一处警告:足够复杂或是巨大的字符串可能导致Python解释器的崩溃,因为Python的AST编译器是有栈深限制的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值