Python写入CSV浮点数异常:大于1的浮点数被转为整数求助
解决Python写入CSV时浮点数莫名变整数的问题
嘿,我之前也踩过类似的CSV写入坑!你遇到的这种“小于1的数值能正常保留小数,大于1的浮点数却直接变成无小数点整数”的情况,大概率是网速数值的类型不对,或者格式藏着小问题——比如字符串格式的数值用了逗号当小数点,结果被CSV解析器(或是打开文件的Excel这类软件)误判了。
为啥会出这问题?
举个实际例子:如果你的downloadSpeed其实是字符串类型的"2,58795654"(用逗号代替点做小数点),而你设置的CSV分隔符又是分号;,那写入后用Excel打开时,Excel会默认把逗号当成千位分隔符直接忽略,自然就把它识别成整数258795654了。而小于1的"0.58795654"因为开头是0,软件不会乱解析,所以能正常显示小数。
给你几个靠谱的解决办法:
1. 先把数值转成浮点数再写入
不管你的原始数据是啥类型,先强制转成浮点数,确保写入的是标准浮点格式:
import csv from datetime import datetime # 假设date是你已经处理好的日期字符串 date = datetime.now().strftime("%Y-%m-%d %H:%M:%S") downloadSpeed = 2.58795654 # 也可以是从其他渠道获取的数值/字符串 uploadSpeed = 0.58795654 with open(data_file_path, 'a+', newline='') as csvfile: writer = csv.writer(csvfile, delimiter=';') # 强制转换为浮点数,从根源杜绝格式问题 writer.writerow([date, float(downloadSpeed), float(uploadSpeed)])
2. 格式化字符串,精确控制小数位数
如果需要固定保留几位小数,避免类型转换的意外,直接把数值格式化成字符串再写入:
with open(data_file_path, 'a+', newline='') as csvfile: writer = csv.writer(csvfile, delimiter=';') # 保留8位小数,和你示例里的精度一致 formatted_down = f"{downloadSpeed:.8f}" formatted_up = f"{uploadSpeed:.8f}" writer.writerow([date, formatted_down, formatted_up])
3. 检查数据源的格式
如果你的网速数值是从接口、日志或其他外部文件获取的,一定要确认原始格式!比如有些欧洲地区的数据源会用逗号当小数点,这时候得先替换成点:
# 比如原始数据是带逗号的字符串 raw_download_str = "2,58795654" downloadSpeed = float(raw_download_str.replace(',', '.'))
怎么验证问题解决了?
别直接用Excel看!先打开记事本查看CSV文件内容,正确的行应该是这样的:
2024-05-20 15:00:00;2.58795654;0.58795654
如果没问题,再用Excel打开,导入的时候记得设置分隔符为分号,并且把网速列的格式设为“数值”,避免Excel自动乱解析。
内容的提问来源于stack exchange,提问作者Pablo Martínez
相关产品推荐
相关产品推荐

