21

我正在使用 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, ...]

我怎么做?

谢谢!

4

4 回答 4

19

您可以将 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])
于 2012-09-30T14:33:46.530 回答
7

使用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
于 2012-09-30T14:33:11.803 回答
6

如果您尝试编写对列输出进行操作的通用代码,则上述解决方案将无法运行。在这种情况下,我们可以以将列返回为 String 的方式编写SELECT查询,我们只需得到我们想要的值。查询可以通过以下方式构建,

SELECT 
 CAST(COL1 AS CHAR) AS COL1,
 CAST(COL2 AS CHAR) AS COL2,
 .
 .
 .
FROM TABLE;
于 2016-07-21T09:41:32.357 回答
3

为避免丢失精度,您可以使用Python 的十进制模块

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)
于 2017-04-12T07:49:28.957 回答