3

我有看起来像的数据

[('A',5.3748),('B',8.324203),('C',3.492)]

我使用以下几行将其保存到 csv:

with open('output.csv','wb') as fp:
    a = csv.writer(fp,delimiter = ",")
    a.writerows(data)

就像一个魅力,除了我想只用两位小数显示我的值。在我的代码前面,我压缩了两个列表来获取数据。因此,如果需要,我可以在之前进行更改。

谢谢!

4

6 回答 6

5

您可以使用字符串格式化语法:

with open('output.csv','wb') as fp:
    a = csv.writer(fp,delimiter = ",")
    a.writerows(map(lambda t: (t[0], "%.2f" % t[1]), data))

诀窍就在这里:

>> "%.2f" % a_number

将打印带有两位小数的数字,而

map(lambda t: (t[0], "%.2f" % t[1]), data)

将这个转换应用到列表中的每个元组data。(见http://docs.python.org/2/library/functions.html#map

于 2013-10-07T14:29:53.177 回答
2

如果您可以隔离要四舍五入的数字,则可以将其格式化为小数点后两位并将其存储为如下字符串:

"%.2f" % myNum
于 2013-10-07T14:24:02.087 回答
1
from itertools import imap
with open('output.csv','wb') as fp:
  a = csv.writer(fp,delimiter = ",")
  a.writerows(imap(lambda x: (x[0], round(x[1], 2)), data))
于 2013-10-07T14:25:08.730 回答
1

尝试使用以下格式格式化小数str.format()

temp = [('A',5.3748),('B',8.324203),('C',3.492)]
newlist = []
for a, b in temp:
    newlist.append((a, "{0:.2f}".format(b)))

作为列表理解,您将获得:

data = [('A',5.3748),('B',8.324203),('C',3.492)]
data = [(a, "{0:.2f}".format(b)) for a, b in temp]

正如@JonClements 指出的那样,您可以替换"{0:.2f}".format(b)format(b, '.2f'). 在这种情况下,这可能是更具可读性的方法。

于 2013-10-07T14:25:10.373 回答
1

您还可以使用 python 的 round() 方法。

round(5.3748, 2)

将其与 csv 编写器一起使用的优点是它保持其数字类型,而不是转换为字符串。这会影响选项,例如在 csv 文件中引用非数字。

如果您不需要担心此类格式化选项,我个人更喜欢将其格式化为字符串,因为即使它们为零,它也会对齐正确的小数位数。即 5.3748 到 "5.3700" 而不是 5.37

于 2020-05-11T01:18:31.323 回答
0

您可以按如下方式格式化列表元素

linux:~ # python
>>> l=[('A',5.3748),('B',8.324203),('C',3.492)]
>>> l=[ (x[0], "%.2f" % x[1]) for x in l]
>>> l
[('A', '5.37'), ('B', '8.32'), ('C', '3.49')]
于 2013-10-07T14:31:41.273 回答