python csv 写入了太多小数

python csv writes too many decimals

提问人:peets 提问时间:10/29/2023 更新时间:10/29/2023 访问量:43

问:

一个经过充分讨论的问题,但找不到合适的答案。 使用代码将 3D 矢量的点 (n,3) 的浮点列表写入文件:

...
with open(filename,"w") as f:
    csvw=csv.writer(f,delimiter=";",quotechar='"')
    for point in points:
        csvw.writerow(point)

给出文件内容:

 0.04471017781221634;0.0;0.999
-0.05707349435937544;-0.052283996037127314;0.997
 0.008731637417420734;0.09949250478307754;0.995
 0.0718653614139638;-0.09373563798705578;0.993
 ...

对于一百万点来说,这是对内存的浪费。使用二进制编码不容易转移到其他程序。所以我更喜欢更紧凑的格式,例如:

 0.044;0.0;0.999
-0.057;-0.052;0.997
 0.008;0.099;0.995
 0.071;-0.093;0.993
 ...

这里小数被截断,四舍五入是首选。 如何更改或扩展代码?提前致谢。

Python CSV 数字

评论

0赞 Mike 'Pomax' Kamermans 10/29/2023
为什么“拥有正确的数字”是浪费记忆?100 万个 32 位浮点数占用 4MB。即使是旧手机也不关心这么小的内存占用,更不用说内存多出数千倍的计算机和笔记本电脑了 =) 另外,请注意,0.0447 不是 0.044,而是 0.045。
0赞 tdelaney 10/29/2023
如果 csv 的默认值不是您想要的,您可以在写入行之前将浮点值转换为字符串。
1赞 John Gordon 10/29/2023
@Mike'Pomax'Kamermans 为什么原生浮子大小在这里很重要?CSV 文件是文本。 是 的四分之一大。0.0440.04471017781221634
0赞 Mike 'Pomax' Kamermans 10/29/2023
这是磁盘空间,而不是内存。这篇文章没有提到磁盘空间是一个问题。

答:

3赞 Sidiox 10/29/2023 #1

[另请参阅][1]

Python 有一个内置的 [round][2],它允许您通过第二个参数指定位数。因此,假设每个点确实只是您的维度列表,那么您的代码就会变成[0.04471017781221634,0.0,0.999]

with open(filename,"w") as f:
    for point in points:
        rounded_point = [round(dim, 3) for dim in point]
        csvw.writerow(rounded_point)

关键点是 ,这是一个列表推导式,其中函数应用于 列表中的每个 。
[1]:将浮点数限制为小数点后两位
[2]:https://docs.python.org/3/library/functions.html#round
rounded_point = [round(dim, 3) for dim in point]rounddimpoint

评论

1赞 Zach Young 10/29/2023
好答案。也许跳过中间的 var 并在 writerow 内四舍五入:.csv.writerow([round(x, 3) for x in point])