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

如何使用Python正确读取Fortran生成的直接访问无格式二进制文件

问题根因

你读取失败的核心原因是混淆了Fortran两种无格式文件的存储结构,同时调用读取接口时没指定正确参数:

  1. 你写文件时用的是access='direct'(直接访问)模式,这种模式生成的是纯裸二进制文件,没有任何额外的记录长度标记,和C语言写的二进制文件结构完全一致;而scipy.io.FortranFile是专门用来读取access='sequential'(顺序访问)模式的无格式文件——这类文件每个记录前后会插入4/8字节的长度标识,你拿它读直接访问的裸文件,自然会报记录截断的错误。
  2. 你调用numpy.fromfile时没指定数据类型,接口默认按双精度浮点数(float64,占8字节)解析,而你存的是real(kind=4)单精度浮点数(占4字节),类型不匹配读出来的数值必然是乱的。
  3. 额外提一句:你贴的Fortran示例代码本身有笔误,外层循环变量写的是num,但数组索引用的是未初始化的num1,实际运行Fortran代码时也会得到错误值,记得把循环变量改成num1。

正确读取方法

针对你写的直接访问二进制文件,用numpy按如下方式读取即可:

import numpy as np

# 1. 指定正确的单精度浮点类型,对应Fortran的real(kind=4)
# 直接读入扁平化的数组
data_flat = np.fromfile("binaryFile", dtype=np.float32)

# 2. 按Fortran列优先顺序重塑数组维度,对应原数组的(140,130)维度
myarray = data_flat.reshape((140, 130), order="F")

# 验证:按你的赋值逻辑,myarray[0,0]应为1.0,myarray[-1,-1]应为18200.0
print(myarray[0,0], myarray[-1,-1])

未知生成环境文件的排查方法

如果你拿到的是未知环境生成的二进制文件,按以下步骤排查即可:

  • 先看文件总大小:如果是140*130个单精度浮点数,文件大小应该正好是140*130*4 = 72800字节,大小匹配就直接用上面的代码读。
  • 如果文件大小比72800多8字节(即72808字节),说明是顺序访问格式的单记录文件,多出来的8字节是记录首尾的长度标记,这时候可以用np.fromfile跳过开头4字节读取,或者用scipy.io.FortranFile读取。
  • 如果文件大小和上述值都不匹配,按总字节数反推数据类型:比如总大小是145600字节就是双精度浮点数(对应np.float64),如果是整数类型就对应np.int32/np.int64试。
  • 如果重塑数组后数值索引不对,要么调整reshape的维度顺序,要么对数组做转置,直到数值符合业务预期即可——未知环境下没有文档时,按文件大小反推是最可靠的方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 14:57:28