我有一个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字符串?
答案 0 :(得分:6)
大多数Fortran未格式化的文件将包含额外的字节以指定记录的长度。记录是使用单个Fortran写入语句编写的项目组。通常在每条记录的开头和结尾有4个字节。因此,在另一种语言中,您将需要阅读这些“隐藏”值并跳过它们。在这种情况下,如果您尝试将它们解释为字符串的一部分,则会向字符串添加不正确的值,这可能具有ASCII的特殊值。
Fortran字符串将是固定长度,并在末尾填充空格,ASCII为0x20。我不希望值0x00,除非字符串未初始化或Fortran程序员使用字符串来保存二进制数据。
在这个时代,如果Fortran程序员正在编写一个打算与另一种语言一起使用的无格式/二进制文件,它们可以通过使用Fortran 2003的“stream”IO方法来省略这些额外的字节。
答案 1 :(得分: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!'