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

如何在Python中读取Fortran格式数值文件并处理字节串问题?

解决NumPy读取Fortran格式数值时的字节串问题

我来帮你搞定这个困扰!当你用np.genfromtxt(data, dtype=None)读取包含0.755473D-08这类Fortran风格科学计数法的文本文件时,结果出现b'0.755473D-08'这种带b前缀的字节串,本质是两个问题:一是NumPy默认把无法直接识别为数值的内容解析成字节型字符串(bytes),二是Python原生只认e表示的科学计数法,不认Fortran的D标记。下面给你两种实用的解决思路:

方法一:读取时直接转换(推荐)

利用np.genfromtxt的converters参数,在读取过程中就完成字节串解码、格式替换和数值转换,一步到位得到数值数组:

import numpy as np

def parse_fortran_num(b_str):
    # 1. 把字节串解码为普通字符串
    # 2. 替换Fortran的D为Python认可的e
    # 3. 转换为浮点型数值
    return float(b_str.decode('utf-8').replace('D', 'e'))

# 假设你的数据文件名为fortran_data.txt
# 如果是多列数据,converters可以指定多列,比如{0: parse_fortran_num, 1: parse_fortran_num}
data_array = np.genfromtxt('fortran_data.txt', dtype=None, converters={0: parse_fortran_num})

这样读取出来的data_array直接是浮点型数组,完全看不到b前缀和D标记。

方法二:读取后批量处理

如果已经完成读取,得到了带字节串的数组,也可以事后批量处理:

import numpy as np

# 假设已读取的原始数据是带字节串的数组
raw_data = np.genfromtxt('fortran_data.txt', dtype=None)

# 第一步:把所有字节串解码为普通字符串
str_data = np.char.decode(raw_data, encoding='utf-8')

# 第二步:批量替换D为e并转换为数值
# 方式1:列表推导式(适合小规模数据)
num_data = np.array([float(s.replace('D', 'e')) for s in str_data])

# 方式2:用vectorize实现向量化转换(适合大规模数据,效率更高)
convert_func = np.vectorize(lambda s: float(s.replace('D', 'e')))
num_data = convert_func(str_data)

额外提示

如果你的文件里所有列都是这种Fortran格式的数值,也可以简化转换器的使用:比如定义一个通用转换器,让genfromtxt对所有列应用转换逻辑,不需要逐个指定列号。

内容的提问来源于stack exchange,提问作者kinder chen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 08:30:01