在python中读取二进制文件

2024-03-25

我必须用 python 读取二进制文件。首先由 Fortran 90 程序这样编写:

open(unit=10,file=filename,form='unformatted')
write(10)table%n1,table%n2
write(10)table%nH
write(10)table%T2
write(10)table%cool
write(10)table%heat
write(10)table%cool_com
write(10)table%heat_com
write(10)table%metal
write(10)table%cool_prime
write(10)table%heat_prime
write(10)table%cool_com_prime
write(10)table%heat_com_prime
write(10)table%metal_prime
write(10)table%mu
if (if_species_abundances) write(10)table%n_spec
close(10)

我可以使用以下 IDL 代码轻松读取此二进制文件:

n1=161L
n2=101L
openr,1,file,/f77_unformatted
readu,1,n1,n2
print,n1,n2
spec=dblarr(n1,n2,6)
metal=dblarr(n1,n2)
cool=dblarr(n1,n2)
heat=dblarr(n1,n2)
metal_prime=dblarr(n1,n2)
cool_prime=dblarr(n1,n2)
heat_prime=dblarr(n1,n2)
mu  =dblarr(n1,n2)
n   =dblarr(n1)
T   =dblarr(n2)
Teq =dblarr(n1)
readu,1,n
readu,1,T
readu,1,Teq
readu,1,cool
readu,1,heat
readu,1,metal
readu,1,cool_prime
readu,1,heat_prime
readu,1,metal_prime
readu,1,mu
readu,1,spec
print,spec
close,1

我想做的是用 Python 读取这个二进制文件。但也存在一些问题。 首先,这是我读取文件的尝试:

import numpy
from numpy import *
import struct

file='name_of_my_file'
with open(file,mode='rb') as lines:
    c=lines.read()

我尝试读取前两个变量:

dummy, n1, n2, dummy = struct.unpack('iiii',c[:16])

但正如你所看到的,我必须添加虚拟变量,因为不知何故,Fortran 程序在这些位置添加了整数 8。

现在的问题是尝试读取其他字节时。我没有得到与 IDL 程序相同的结果。

这是我尝试读取数组 n

 double = 8
 end = 16+n1*double
 nH = struct.unpack('d'*n1,c[16:end])

然而,当我打印这个数组时,我得到了无意义的值。我的意思是,我可以使用上面的 IDL 代码读取该文件,所以我知道会发生什么。所以我的问题是:当我不确切知道结构时如何读取这个文件?为什么使用 IDL 阅读起来如此简单?我需要用Python读取这个数据集。


您正在寻找的是struct http://docs.python.org/library/struct.html module.

该模块允许您从字符串中解包数据,将其视为二进制数据。

您提供格式字符串和文件字符串,它将消耗返回二进制对象的数据。

例如,使用您的变量:

import struct
content = f.read() #I'm not sure why in a binary file you were using "readlines",
                   #but if this is too much data, you can supply a size to read()
n, T, Teq, cool = struct.unpack("dddd",content[:32])

这将使 n、T、Teq 和 Cool 保留二进制文件中的前四个双精度数。当然,这只是一个演示。您的示例看起来需要双打列表 - 方便struct.unpack返回一个元组,我将其用于您的情况仍然可以正常工作(如果没有,您可以列出它们)。请记住struct.unpack需要消耗传递给它的整个字符串 - 否则你会得到一个struct.error。因此,要么对输入字符串进行切片,要么仅read您将使用的字符数,就像我在上面的评论中所说的那样。

例如,

n_content = f.read(8*number_of_ns) #8, because doubles are 8 bytes
n = struct.unpack("d"*number_of_ns,n_content)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在python中读取二进制文件 的相关文章

随机推荐

  • 将 save_model.pb 转换为 model.tflite

    张量流版本 2 2 0 操作系统 Windows 10 我正在尝试将 saving model pb 转换为 tflite 文件 这是我正在运行的代码 import tensorflow as tf Convert converter tf
  • 尝试编写 JPA 2.1 左外连接时出现“with 子句只能引用驱动表中的列”

    我正在使用 JPA 2 1 和 Hibernate 4 3 6 Final 我正在尝试使用 CriteriaBuilder 编写带条件的左外连接 所以我有 final CriteriaBuilder cb m entityManager g
  • 超越开闭原则

    我有一个简单的程序 它根据用户提供的鼠标数据绘制几何图形 我有一个处理鼠标跟踪的类 它获取带有鼠标移动历史记录的列表 和一个 名为 Shape 的抽象类 从这个类中 我派生了一些额外的形状 如圆形 矩形等 并且它们中的每一个都覆盖了抽象的
  • 标签文本换行但不缩进第二行

    我有一个宽度有限的表单 但是标签文本可能比表单宽度长 因此文本被换行为多行 我的问题是 由于输入元素 第一行缩进 但第二行没有缩进 这使得表单不太好 你有什么想法让第二行 第三行 将缩进为第一行 只使用CSS吗 Actual 我的期望是 这
  • 调试 Chrome 上加载的源映射

    我在缩小过程中生成 javascript 文件的源映射 使用地图文件旁边的缩小 JS 文件中的相对 URL 来引用地图文件 这是末尾的评论示例app e47a6637 js sourceMappingURL app e47a6637 js
  • `http://localhost` 上的安全 Cookie

    我正在尝试设置安全 cookiehttp localhost 3000 设置 Cookie loggedUser brillout 最大年龄 315360000 路径 仅 Http 安全的 但 Chrome 抱怨道 此 Set Cookie
  • MS Access 的新管理员,如何修改现有宏

    我是 MS Access 数据库的新管理员 我对 MS Access 很陌生 所以如果我问的问题在这里没有意义 请原谅我 当前员工的桌面上有一个小的 5MB 左右 mdb 文件 单击该文件将打开 Access 并在 Access 左侧列出查
  • 使用 ACR122U NFC 读卡器对 Mifare 1K NFC 标签进行身份验证失败

    我在使用ACR122U工具验证Mifare 1K NFC标签时总是得到失败结果 但我可以使用Android手机读取 写入该标签 ACR122U Load Authentication Keys lt FF 82 00 00 06 FF FF
  • Android Gallery 中 CoverFlow 中的错误图像重叠

    我正在摆弄 CoverFlow从这里 http www inter fuser com 2010 02 android coverflow widget v2 html以满足我的喜好并且无法解决一个问题 这是屏幕截图 截屏 https i
  • orderBy 在 Laravel 5 中不起作用

    我正在使用以下查询 orderBy在下面的查询中不起作用 此查询在本地主机中有效 但在在线服务器中无效 return DB table reports gt leftJoin sources reports report source id
  • 通过 OleDb ACE 访问 Excel 2007 二进制文件 (.xlsb)

    我发现 Excel 2007 二进制格式 扩展名为 xlsb 非常完美 适合我的需求 因为它加载速度快且非常紧凑 我交付一个 Excel 中的一堆报告包含大量数据 这些报告是 实际上正在加载一个 IS 包 所以我假设转换为这种格式 请阅读有
  • 如何打印json数据。

    我有一个像这样的 json 输出数组 data name Ben Thorpe id XXXXXXXXXXX name Francis David id XXXXXXXXXXX 我想循环遍历它并使用 javascript 打印出所有名称 我
  • 弹出视图的位置问题

    当我在 iPad 中的纵向视图和横向视图 反之亦然 之间切换时 我的弹出视图的位置出现乱码 这是我计算弹出视图框架的方法 aRect self myElement frame aRect origin x aRect size width
  • API“BaseVariant.getApplicationIdTextResource”已过时,已替换为“VariantProperties.applicationId”

    构建 gradle 时我收到以下消息 API BaseVariant getApplicationIdTextResource is obsolete and has been replaced with VariantProperties
  • 在 matplotlib 中向颜色条添加白色背景

    我想通过添加白色背景使我的颜色条更加明显 我需要图像内的颜色条 这有时很难阅读 这是没有白色背景的代码 import matplotlib pyplot as plt import numpy as np a np random rand
  • CSS3动画“进度”回调

    我只是想知道是否有一种方法可以监视元素动画的进度 我所知道的是animationstart and animationend 有没有某种animationprogress 不 没有animationprogess事件 根据W3规格 http
  • 如何使用 sqlalchemy IntegrityError 查找有问题的属性

    我有一个非常简单的 SqlAlchemy 模型 class User Base The SQLAlchemy declarative model class for a User object tablename users id Colu
  • Javascript - 跟踪任何 xmlhttprequest

    我可以检查页面上的任何 XmlHttpRequest 可执行文件 而无需分别添加 addEventListener 吗 我尝试添加 document addEventListener loadend 但什么也没发生 看起来请求没有全局事件
  • 在Python中提取每个子列表的第一项

    我想知道提取列表列表中每个子列表的第一项并将其附加到新列表的最佳方法是什么 所以如果我有 lst a b c 1 2 3 x y z 还有 我想拔出来a 1 and x并从中创建一个单独的列表 I tried lst2 append x 0
  • 在python中读取二进制文件

    我必须用 python 读取二进制文件 首先由 Fortran 90 程序这样编写 open unit 10 file filename form unformatted write 10 table n1 table n2 write 1