Python是否存在Fortran可重复格式描述符的等价实现?含示例
在Python中复现Fortran风格的格式化(含重复最后格式符+读写兼容)
当然可以在Python里模拟Fortran这种特殊的字符串格式化行为!不过得先明确你提到的(f5.2,10(f8.3))格式的核心规则:先按f5.2处理1个参数,接着按f8.3处理10个参数;若参数数量超过11个,剩下的所有参数都重复使用最后一个格式描述符f8.3;同时这个格式既能用来生成字符串(写入),也能用来解析字符串(读取)。
Python的标准格式化工具(比如str.format())本身没有自动重复最后格式符的机制,但我们可以通过简单的封装函数来实现这个效果,下面分写入和解析两部分说明:
一、写入:生成符合Fortran格式的字符串
我们可以写一个辅助函数,根据参数数量动态生成对应的Python格式字符串,自动补全重复的最后格式符:
def format_like_fortran(args): # 对应Fortran格式 (f5.2,10(f8.3)) # 固定格式部分:1个{:5.2f} + 10个{:8.3f} fmt_parts = ["{:5.2f}"] + ["{:8.3f}"] * 10 # 如果参数数量超过11,追加对应数量的{:8.3f} extra_args_count = max(0, len(args) - 11) fmt_parts.extend(["{:8.3f}"] * extra_args_count) # 拼接成完整格式字符串并格式化 return "".join(fmt_parts).format(*args) # 测试示例:1个首参数 + 12个后续参数(超过10个的部分用重复的f8.3) test_args = [1.23, 4.567, 8.901, 2.345, 6.789, 0.123, 4.567, 8.901, 2.345, 6.789, 0.123, 4.567, 8.901] formatted_str = format_like_fortran(test_args) print(formatted_str)
这段代码会输出:
1.23 4.567 8.901 2.345 6.789 0.123 4.567 8.901 2.345 6.789 0.123 4.567 8.901
完全符合Fortran格式的输出逻辑。
二、解析:从格式化字符串还原数值
对应Fortran的读取功能,我们需要按照格式的宽度分割字符串,再转换为数值:
def parse_fortran_format(formatted_str): parsed = [] # 处理第一个字段:宽度5 first_chunk = formatted_str[:5].strip() parsed.append(float(first_chunk)) # 处理后续所有字段:每个宽度8 remaining_str = formatted_str[5:] # 按8位步长分割剩余字符串 for i in range(0, len(remaining_str), 8): chunk = remaining_str[i:i+8].strip() if chunk: # 跳过可能的空字符段 parsed.append(float(chunk)) return parsed # 用上面生成的字符串测试解析 parsed_values = parse_fortran_format(formatted_str) print(parsed_values)
输出会还原出原始的参数列表(浮点数精度误差可忽略)。
通用化扩展
如果需要适配其他Fortran格式,只需要修改函数中的格式参数:比如把["{:5.2f}"] + ["{:8.3f}"] *10改成对应格式的Python占位符,解析函数中修改对应的宽度即可。
内容的提问来源于stack exchange,提问作者Seb
相关产品推荐
相关产品推荐

