如何在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
相关产品推荐
相关产品推荐

