Python大字符串/数组固定格式打印实现:每行9个数值且小数点对齐
Python 定长行输出+数值小数点对齐实现
问题描述
我需要将体量较大的字符串或数组按固定格式打印输出,以便与目标数据文件完成比对。
原始代码与问题
原有测试代码如下(Python 2 语法):
import re string1 ='2222//000000' string2 = '-0.0000023 0.0000008 0.0000001 0.9716336 -0.1052695 -0.0000001 -0.0000002 0.0000007 -0.0000000 \ 0.0000000 0.0000000 0.1316705 0.1175425 -0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 \ 0.0000000 0.0000000 0.0000003 0.0000000 -0.0000001 -0.0000000 0.0000000 -0.0000000 0.0000001 \ 0.0000000 -0.0000003 0.0000000 -0.0000000 -0.0000001 -0.0000001 0.0106146 0.1165349' split = re.findall(r'(?:\b|-)\d+(?:\.\d+)?', string2) for i in range (3): print "{0:<18}".format( string1 ), for j in range ( len(split) ): print "{0:<10}".format(split[j]), if j != 0 and j%9 == 0: print "\n", "{0:<18}".format(" " ), print "\n"
原有输出的问题:
- 数值用左对齐格式化,小数点位置不统一
- 换行逻辑判断冗余,容易出现行元素数量不对的情况
- 后续行的缩进宽度和首行标识字符串不匹配
- 冗余的外层循环
for i in range(3)会导致重复输出3次相同内容,不符合需求
调整方案
核心调整点
- 数值对齐处理:将拆分后的字符串转成浮点数,统一用固定宽度、固定小数位的格式输出,保证小数点自动对齐(本次样本数值均为7位小数,设置单值占12位宽度、保留7位小数即可实现对齐)
- 分组处理:先把拆分后的数值按每9个一组拆分,从逻辑上避免逐元素判断换行的冗余
- 行前缀处理:首行输出左对齐占18位的
string1,后续行直接输出18位宽度的空格作为前缀,保证缩进对齐
调整后代码(兼容Python 2/3)
import re string1 = '2222//000000' string2 = '-0.0000023 0.0000008 0.0000001 0.9716336 -0.1052695 -0.0000001 -0.0000002 0.0000007 -0.0000000 \ 0.0000000 0.0000000 0.1316705 0.1175425 -0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 \ 0.0000000 0.0000000 0.0000003 0.0000000 -0.0000001 -0.0000000 0.0000000 -0.0000000 0.0000001 \ 0.0000000 -0.0000003 0.0000000 -0.0000000 -0.0000001 -0.0000001 0.0106146 0.1165349' # 拆分数值 num_list = [float(s) for s in re.findall(r'-?\d+\.\d+', string2)] # 按每9个元素分组 grouped_nums = [num_list[i:i+9] for i in range(0, len(num_list), 9)] for line_idx, group in enumerate(grouped_nums): # 首行放string1,后续行用等宽空格填充 prefix = "{0:<18}".format(string1) if line_idx == 0 else " " * 18 # 格式化每个数值:右对齐占12位,保留7位小数,自动对齐小数点 line_content = "".join(["{:>12.7f}".format(num) for num in group]) print(prefix + line_content)
输出效果
2222//000000 -0.0000023 0.0000008 0.0000001 0.9716336 -0.1052695 -0.0000001 -0.0000002 0.0000007 -0.0000000 0.0000000 0.0000000 0.1316705 0.1175425 -0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000000 0.0000003 0.0000000 -0.0000001 -0.0000000 0.0000000 -0.0000000 0.0000001 0.0000000 -0.0000003 0.0000000 -0.0000000 -0.0000001 -0.0000001 0.0106146 0.1165349
如果需要调整数值宽度,只要修改{:>12.7f}里的12即可,7对应需要保留的小数位数,和样本的小数位匹配就能保证小数点完全对齐。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

