Python如何将'2.6840000e+01'类科学计数法数据转换为常规数值格式
问题原因
你当前得到科学计数法格式的输出,核心原因是将所有处理后的值转为float类型存入numpy数组,numpy默认对浮点数的字符串表示会采用科学计数法,且你将二进制字符串转为float存储会丢失原本的字符串格式。同时你现有逻辑无需借助numpy矩阵存储,直接逐行处理写入文件即可大幅简化代码。
最简实现方案
你可以直接在读取每一行完成处理后,就按要求格式化写入目标文件,无需中间矩阵存储,代码如下:
# 假设你已经实现了以下三个工具函数,逻辑保持不变 def float_yuvarla(num): # 你的四舍五入逻辑,示例为保留2位小数,可替换为你自己的规则 return round(num, 2) def binary_decimal(bin_str): # 二进制转十进制逻辑 return int(bin_str, 2) def hexa_binary(hex_str): # 十六进制转二进制字符串,去掉前缀0b return bin(int(hex_str, 16))[2:] # 主逻辑 with open("input.txt", "r") as in_f, open("fall.txt", "w") as out_f: for line in in_f: line = line.strip() # 只处理以1开头的行 if not line.startswith("1"): continue cols = line.split() # 逐列处理 col1 = cols[0] # 第一列保持不变 col2 = float_yuvarla(float(cols[1])) # 第二列四舍五入 col3 = binary_decimal(cols[2]) # 第三列二进制转十进制 col4 = hexa_binary(cols[3]) # 第四列十六进制转二进制 # 按要求格式化后写入文件 out_line = f"{col1} {col2} {col3} {col4}\n" out_f.write(out_line)
如果你确实需要保留numpy矩阵存储的逻辑,只需要修改写入时的格式化方式即可,不要直接调用str(array1),而是逐行逐元素格式化:
# 原有逻辑生成array1后,替换写入部分的代码 with open("fall.txt","w") as ff: for row in array1: # 按要求格式化每一列 col1 = int(row[0]) col2 = round(row[1], 2) col3 = int(row[2]) col4 = bin(int(row[3]))[2:] ff.write(f"{col1} {col2} {col3} {col4}\n")
科学计数法字符串转普通float的方法
你提到的'2.6840000e+01'这类字符串转普通float非常简单,直接调用float()即可转换:
s = '2.6840000e+01' num = float(s) print(num) # 输出26.84
如果需要输出的时候不显示科学计数法,格式化的时候指定小数位数即可,比如f"{num:.2f}"即可输出26.84。
内容的提问来源于stack exchange,提问作者anbvy
相关产品推荐
相关产品推荐

