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

概述

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编译器是有栈深限制的。

原创文章 12 获赞 20 访问量 1468

猜你喜欢

转载自blog.csdn.net/wuwei_201/article/details/105750460