You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:32:25