使用python读取fortran未格式化文件

发布于 2024-12-15 16:53:25 字数 355 浏览 0 评论 0原文

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

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

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

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

I have a fortran program generating unformatted files and I am trying to read them into Python.

I have the source code so I know the first "chunk" is a character array of character*1 name(80) and so on. So I start out with

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

and name is an 80-length tuple consisting of strings of length 1; some of the contents of which are hexadecimal strings (e.g., \x00). How can I go about converting this variable to a single ascii string?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

森末i 2024-12-22 16:53:25

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

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

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

Most Fortran unformatted files will contain extra bytes to specify the length of the record. A record is the group of items written with a single Fortran write statement. Typically 4-bytes at the beginning and end of each record. So in another language you will want to read these "hidden" values and skip them. In this case, if you try to interpret them as part of your string, you will add incorrect values to the string, which will likely have peculiar values for ASCII.

A Fortran string will be fixed length and padded on the end with blanks, which is 0x20 in ASCII. I would not expect the value 0x00 unless the string was not initialized or the Fortran programmer was using a string to hold binary data.

In this era, if a Fortran programmer is writing an unformatted/binary file that is intended for use with another language, they can cause these extra bytes to be omitted by using the "stream" IO method of Fortran 2003.

阪姬 2024-12-22 16:53:25

首先使用正确的格式说明符,然后去掉 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!'

Use the correct format specifier in the first place, then strip off the NULs.

>>> 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!'
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文