如何将数值列表格式化为5列固定宽度科学记数法并写入文本文件
数值转地震动专用固定宽度科学计数法格式实现方案
需求说明
将任意精度的数值列表转换为指定格式的科学记数法,输出为5列的固定宽度文本文件,适配地震动时程数据集通用格式要求。
背景说明
该固定宽度文件格式是地震动时程数据集的通用格式,部分地震动输入处理软件仅支持该格式,实现等间隔地震动时程纵坐标值的格式化输出方案可为地球物理领域相关工作提供参考。
现有实现问题
默认Python的.5e格式化输出为小数点前1位的标准科学计数法,不符合地震动格式要求的「小数点前补0、指数对应加1、0值无指数后缀、固定宽度对齐」规则。
示例数据集
lst = [-9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
期望输出格式
-0.90000e+01 -0.80000e+01 -0.70000e+01 -0.60000e+01 -0.50000e+01 -0.40000e+01 -0.30000e+01 -0.20000e+01 -0.10000e+01 0.00000 0.10000e+01 0.20000e+01 0.30000e+01 0.40000e+01 0.50000e+01 0.60000e+01 0.70000e+01 0.80000e+01 0.90000e+01 0.10000e+02
实现代码
import math def format_seismic_value(num, decimals=5, col_width=13): # 0值特殊处理,无指数后缀 if num == 0: return f"{'0.' + '0'*decimals:^{col_width}}" # 计算符合要求的系数和指数 abs_num = abs(num) exp = int(math.floor(math.log10(abs_num))) + 1 coeff = num / (10 ** exp) # 格式化后调整指数格式,去掉前导0 formatted = f"{coeff:.{decimals}f}e{exp:+03d}".replace("e+0", "e+").replace("e-0", "e-") # 补空格对齐固定宽度 return formatted.rjust(col_width) # 测试数据集 value_lst = [-9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] # 批量格式化 formatted_lst = [format_seismic_value(v) for v in value_lst] # 按5列分组输出并写入文件 with open("seismic_output.txt", "w", encoding="utf-8") as f: for idx in range(0, len(formatted_lst), 5): line = "".join(formatted_lst[idx:idx+5]) # 控制台打印 print(line) # 写入文件 f.write(line + "\n")
代码说明
- 自定义格式化函数单独处理0值,匹配需求中0值无指数后缀的要求
- 对数计算调整系数和指数,实现小数点前补0的非标准科学计数法格式
- 固定每列宽度,自动补空格实现全局对齐
- 支持任意精度数值输入,可通过参数调整小数保留位数、列宽度
内容的提问来源于stack exchange,提问作者felimz
相关产品推荐
相关产品推荐

