2011-11-15 40 views
1

我有一個Fortran程序生成未格式化的文件,我試圖將它們讀入Python。使用python讀取fortran格式的文件

我有源代碼,所以我知道第一個「塊」是character*1 name(80)等字符數組。因此,我在開始時

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

name和是由長度爲1的串的一個80元組的長度;其中的一些內容是十六進制字符串(例如,\x00)。我怎樣才能將這個變量轉換爲一個ASCII字符串?

+0

我想我也應該使用'open(filename,'r')'而不是''rb''。 – hatmatrix

回答

6

大多數Fortran未格式化的文件將包含額外的字節來指定記錄的長度。記錄是用一個Fortran寫入語句編寫的一組項目。通常每個記錄的開頭和結尾都有4個字節。因此,在另一種語言中,您將希望閱讀這些「隱藏」值並跳過它們。在這種情況下,如果嘗試將它們解釋爲字符串的一部分,則會向字符串添加不正確的值,這可能會對ASCII有特殊的值。

Fortran字符串的長度是固定的,並在末尾填充空格,即ASCII中的0x20。我不希望值爲0x00,除非該字符串未初始化,或者Fortran程序員使用字符串來保存二進制數據。

在這個時代,如果Fortran程序員正在編寫一個旨在與其他語言一起使用的未格式化/二進制文件,則可以使用Fortran 2003的「stream」IO方法來省略這些額外的字節。

+0

這非常有幫助,謝謝。 – hatmatrix

+0

如果您有權訪問編寫此文件的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!' 
+0

啊,不知道我可以使用這個說明符。我發現'\ x00'是NULL,但我也有其他字符串,比如'\ xa0','@ \ x08等...是否有hex-> ascii轉換器?我一直在環顧四周,覺得奇怪的是我沒有遇到過。 – hatmatrix

+0

\ x80以下的任何內容都是ASCII。也許你需要進一步解碼,或者決定你正在查看不同的字符集。 –

+0

也許就是這樣。謝謝。 – hatmatrix