python查询mysql decimal报错_python读取MySQL数据表时,使用ast模块转换decimal格式数据的坑...
概述
MySQL中常用的數(shù)據(jù)格式有tinyint()、int()、float()、double()、decimal() 、varchar、enum()、datetime;小數(shù)格式中decimal比較常用,因?yàn)楦泳_,這里就以decimal為例。
從MySQL中讀取了一行數(shù)據(jù),內(nèi)容為:(17479, datetime.datetime(2020, 4, 1, 0, 0), Decimal('23646.00'), Decimal('23646.00'), Decimal('23622.00'),因?yàn)樾枰ㄟ^(guò)TCP傳遞給用戶,所以把數(shù)據(jù)轉(zhuǎn)換為字符串,用戶端接收到數(shù)據(jù)后,需要再把字符串還原,還原字符串常用模塊ast,例如:ast.literal_evel(),這里就遇到坑了,直接使用ast.literal_evel()會(huì)報(bào)錯(cuò),報(bào)錯(cuò)的原因呢,就是Decimal(‘23646.00’)這種格式ast模塊不認(rèn)識(shí)。
解決方案
首先,Decimal 是decimal模塊的一個(gè)類,那么先導(dǎo)入。與ast.literal_evel()類似的功能還有一個(gè)evel(),直接使用evel()還原數(shù)據(jù)就不會(huì)出問(wèn)題,這是為什么呢?
evel()與ast.literal_evel()的區(qū)別
eval()在做數(shù)據(jù)轉(zhuǎn)換前并不知道需要轉(zhuǎn)化的數(shù)據(jù)是否合法的python數(shù)據(jù)類型。只是在調(diào)用函數(shù)的時(shí)候去計(jì)算。如果被計(jì)算的內(nèi)容不是合法的python類型就會(huì)拋出異常。而ast.literal_evel()會(huì)先判斷需要轉(zhuǎn)換的內(nèi)容是不是合法的python數(shù)據(jù)類型,如果是則進(jìn)行轉(zhuǎn)換,否則就不進(jìn)行轉(zhuǎn)換。因此,平時(shí)還是推薦使用ast.literal_eval()
但是遇到了Decimal(‘23646.00’)事件,為省事期間還是直接使用eval()吧。
簡(jiǎn)單的示例:
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模塊的注意事項(xiàng)
ast官方文檔
ast模塊的比較常用的兩個(gè)方法parse和literal_evel,從官方文檔可以看到這兩個(gè)方法都有一處警告:足夠復(fù)雜或是巨大的字符串可能導(dǎo)致Python解釋器的崩潰,因?yàn)镻ython的AST編譯器是有棧深限制的。
總結(jié)
以上是生活随笔為你收集整理的python查询mysql decimal报错_python读取MySQL数据表时,使用ast模块转换decimal格式数据的坑...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 古墓:黑夜中不断的断龙石敲击声
- 下一篇: 使用主题文件(包含CSS文件)时遇到的问