【问题标题】:reading fortran unformatted file with python用python读取fortran无格式文件
【发布时间】:2011-11-15 03:42:51
【问题描述】:

我有一个生成无格式文件的 fortran 程序,我正在尝试将它们读入 Python。

我有源代码,所以我知道第一个“块”是character*1 name(80) 的字符数组,依此类推。所以我从

f = open(filename,'rb')
bytes = 80
name = struct.unpack('c'*bytes,f.read(bytes))

name 是一个长度为80 的元组,由长度为1 的字符串组成;其中一些内容是十六进制字符串(例如,\x00)。如何将此变量转换为单个 ascii 字符串?

【问题讨论】:

  • 我想我也应该使用open(filename,'r') 而不是'rb'

标签: python ascii fortran


【解决方案1】:

大多数 Fortran 无格式文件将包含额外的字节来指定记录的长度。记录是使用单个 Fortran 写入语句写入的一组项目。通常在每条记录的开头和结尾有 4 个字节。因此,在另一种语言中,您将需要阅读这些“隐藏”值并跳过它们。在这种情况下,如果您尝试将它们解释为字符串的一部分,则会在字符串中添加不正确的值,而这些值可能具有特殊的 ASCII 值。

Fortran 字符串将是固定长度并在末尾用空格填充,即 ASCII 中的 0x20。除非字符串未初始化或 Fortran 程序员使用字符串保存二进制数据,否则我不会期望值 0x00。

在这个时代,如果 Fortran 程序员正在编写一个旨在与另一种语言一起使用的未格式化/二进制文件,他们可以通过使用 Fortran 2003 的“流”IO 方法来省略这些额外的字节。

【讨论】:

  • 如果您有权访问编写此文件的 Fortran 源代码,您可以轻松检查并查看是否是这种情况 - 如果它使用顺序 I/O(默认),它将有记录页眉/页脚如果指定为直接访问,则不会。您还可以查看文件大小并根据您知道它包含的内容计算其“预期”大小 - 如果它更大并且您确定您拥有所有内容,那么它很可能是这些记录页眉/页脚的结果。跨度>
【解决方案2】:

首先使用正确的格式说明符,然后去掉 NUL。

>>> struct.unpack('%ds' % 20, 'Hello, World!' + '\x00' * 7)
('Hello, World!\x00\x00\x00\x00\x00\x00\x00',)
>>> struct.unpack('%ds' % 20, 'Hello, World!' + '\x00' * 7)[0].rstrip('\x00')
'Hello, World!'

【讨论】:

  • 啊,不知道我可以使用这个说明符。我看到 \x00 是 NULL,但我也有其他字符串,如 \xa0、`@\x08 等等……有 hex->ascii 转换器吗?我一直在环顾四周,发现我没有遇到一个很奇怪。
  • \x80 以下的任何内容都已经是 ASCII。也许您需要进一步解码,或者决定您正在查看不同的字符集。
  • 也许是这样。谢谢。
  • 您确定数据真的要被解释为文本吗?
猜你喜欢
  • 2013-02-05
  • 1970-01-01
  • 2012-10-27
  • 2015-07-15
  • 2013-02-14
  • 1970-01-01
  • 2012-12-29
  • 2013-09-09
  • 2020-04-07
相关资源
最近更新 更多