提问人:peets 提问时间:10/29/2023 更新时间:10/29/2023 访问量:43
python csv 写入了太多小数
python csv writes too many decimals
问:
一个经过充分讨论的问题,但找不到合适的答案。 使用代码将 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
...
这里小数被截断,四舍五入是首选。 如何更改或扩展代码?提前致谢。
答:
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#roundrounded_point = [round(dim, 3) for dim in point]
round
dim
point
评论
1赞
Zach Young
10/29/2023
好答案。也许跳过中间的 var 并在 writerow 内四舍五入:.csv.writerow([round(x, 3) for x in point])
下一个:测试字符串是否包含重复字符
评论
0.044
0.04471017781221634