2011-11-15 16 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長のタプルです。その内容の一部は16進文字列(例えば、\x00)である。この変数を単一のASCII文字列に変換する方法を教えてください。

+0

私は '' rb ''の代わりに' 'open(filename、' r ')'を使うべきだと思います。 – hatmatrix

答えて

6

ほとんどのFortranフォーマットされていないファイルには、レコードの長さを指定するための余分なバイトが含まれます。レコードは、単一のFortran記述文で記述された項目のグループです。通常、各レコードの先頭と末尾に4バイト。したがって、別の言語では、これらの「隠された」値を読んでスキップする必要があります。この場合、それらを文字列の一部として解釈しようとすると、不正な値が文字列に追加されます。この値には、ASCIIの固有の値が含まれている可能性があります。

Fortran文字列は長さが固定され、末尾に空白(ASCIIの0x20)が埋め込まれます。文字列が初期化されていないか、Fortranプログラマが文字列を使ってバイナリデータを保持していない限り、値0x00は期待できません。

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などのような他の文字列も持っています...そこには16進数のascii変換器がありますか?私は周りを見回してきたし、私は1つに遭遇していないことが奇妙に感じる。 – hatmatrix

+0

\ x80より下のものはすべてASCIIです。おそらく、さらにデコードしたり、別のキャラクタセットを見ていると判断したりする必要があります。 –

+0

そうかもしれない。ありがとう。 – hatmatrix

関連する問題