从 mysqldb 查询中获取原始十进制值
Posted
技术标签:
【中文标题】从 mysqldb 查询中获取原始十进制值【英文标题】:get raw decimal value from mysqldb query 【发布时间】:2012-09-21 15:16:43 【问题描述】:我正在使用 mysqldb 包在 python 中执行 mysql 查询。代码如下所示:
c=db.cursor()
c.execute("""select * from table""")
output = []
for row in c:
output.append(row[4])
其中row[4]
包含我想存储在output
列表中的十进制值。
问题是我得到的每个值都像这样:Decimal('XX.XX')
我想要在output
列表中的所有值都是 XX.XX。在脚本的最后,我的output
列表如下所示:
[Decimal('10.02'), Decimal('20.24'), ...]
但我需要它只包含数字,如下所示:
[10.02, 20.24, ...]
我该怎么做?
谢谢!
【问题讨论】:
【参考方案1】:您可以将 Decimal 对象转换为字符串:
cursor = db.cursor()
cursor.execute("""select * from table""")
output = []
for row in cursor:
output.append(str(row[4]))
或浮动:
cursor = db.cursor()
cursor.execute("""select * from table""")
output = []
for row in cursor:
output.append(float(row[4]))
将其转换为浮点数会导致其失去全部精度,因此像 20.24 这样的值将变为 20.239999999999998。
此外,如果值为None
,将其转换为浮点数将引发异常。为避免这种情况,您可以使用这样的辅助函数:
def convert_mysql_decimal_to_float(decimal_object):
if (decimal_object == None):
return None
else:
return float(decimal_object)
cell_value = convert_mysql_decimal_to_float(row[4])
【讨论】:
好的。我们可以轻松地将 Decimal('XX.XX') 转换为 XX.XX。但是为什么我们首先得到十进制。理想情况下,它应该在查询正确后返回一个整数或浮点数。我们是否有任何文档链接解释获取小数。 @Maksym Polshcha @shreeshkatti - 小数是精确的,而浮点数是不精确的,但是 Python 没有像 MySQL 那样的原生 Decimal 类型。为避免意外数据丢失(例如 20.24 转换为 20.239999999999998),该模块返回一个特殊的 Decimal 对象,因此您必须手动转换它。【参考方案2】:使用float()
:
output.append(float(row[4]))
但float()
可能会导致如下结果:
In [184]: float(Decimal('10.02'))
Out[184]: 10.02
In [185]: float(Decimal('20.24'))
Out[185]: 20.239999999999998
【讨论】:
【参考方案3】:如果您尝试编写对列输出进行操作的通用代码,则上述解决方案将无法运行。在这种情况下,我们可以编写我们的SELECT
查询,使列返回为字符串,我们只需得到我们想要的值。
查询可以通过以下方式构建,
SELECT
CAST(COL1 AS CHAR) AS COL1,
CAST(COL2 AS CHAR) AS COL2,
.
.
.
FROM TABLE;
【讨论】:
【参考方案4】:为避免丢失精度,您可以使用Python's decimal module。
from decimal import Decimal
c=db.cursor()
c.execute("""select * from table""")
output = []
for row in c:
row_data = []
for data in row:
if type(data) is Decimal:
row_data.append(float(data))
else:
row_data.append(str(dat))
output.append(row_data)
【讨论】:
小点,但您需要缩进最后一行以将其包含在代码段的其余格式中。 我不认为“如果类型(数据)是十进制:”是正确的。在 python 中没有称为 Decimal 的数据类型。你是怎么执行的? 好的,我们必须从十进制导入十进制以上是关于从 mysqldb 查询中获取原始十进制值的主要内容,如果未能解决你的问题,请参考以下文章
如何从 iOS 中的十六进制/二进制(原始数据)值生成音频文件?
如何从 BluetoothChat 的输入/输出流中读取/写入原始十六进制字节?