用Python读取Fortran未格式化文件

1 投票
2 回答
3827 浏览
提问于 2025-04-17 06:20

我有一个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字符串呢?

2 个回答

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!'
6

大多数Fortran的非格式化文件会包含一些额外的字节,用来指定记录的长度。这里的“记录”指的是用一个Fortran的写入语句写入的一组数据。通常在每个记录的开头和结尾会有4个字节。所以在其他语言中,你需要读取这些“隐藏”的值并跳过它们。如果你把它们当作字符串的一部分来处理,就会把错误的值加到字符串里,这样字符串的ASCII值可能会变得很奇怪。

Fortran中的字符串是固定长度的,末尾会用空格填充,空格在ASCII中是0x20。我不太会期待看到0x00这个值,除非这个字符串没有被初始化,或者Fortran程序员是用字符串来存储二进制数据。

在现在这个时代,如果Fortran程序员写一个非格式化/二进制文件,打算让其他语言使用,他们可以通过使用Fortran 2003的“流”输入输出方法来省略这些额外的字节。

撰写回答