从 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 查询中获取原始十进制值的主要内容,如果未能解决你的问题,请参考以下文章

JAVA:从字符串中获取 UTF-8 十六进制值?

Python Mysqldb 为位值返回 '\x01'

如何从 iOS 中的十六进制/二进制(原始数据)值生成音频文件?

如何从 BluetoothChat 的输入/输出流中读取/写入原始十六进制字节?

从原始像素创建图像,但颜色无法根据 RGBA 十六进制值显示

MySQLdb操作mysql的blob值