用Python读取Fortran未格式化文件
我有一个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的“流”输入输出方法来省略这些额外的字节。