2016-06-16 7 views
1

私はPythonには新しく、基本的なものはいくつか分かりません。私は、オブジェクトの配列を含むバイナリファイルを持っています。格納されるオブジェクトは、従来のC構造です。私はその構造をPythonで作り直し、そのオブジェクトのリストにあるファイルの内容を読み込み、データをいくらか修正し、それを元に戻して保存したいと考えています。私が困っている部分は、ファイルの内容を読むことです。私はファイルを読むことに関するいくつかの同様の質問を読んだが、彼らは私が持っている質問に答えなかった。クラスを定義してクラスメンバーを定義しようとしましたが、__slot__pickleでデータを読み込んでいますが、うまくいきませんでした。また、データメンバの1つが実際には異なる構造のオブジェクトを含む配列であることも関係し得る。このファイルを読むにはどうすればよいでしょうか?pythonクラスのデータメンバーをファイルから読み込みます

答えて

0

あなたはPythonのstruct.unpack()を使用する必要があります。どのようなタイプであるか、ディスク上にどのようにパックされているかを正確に知る必要があります。 pickleは、Pythonの記憶形式に固有のものであり、シリアル化をPython特有のものに変換している場合を除き、あなたにはまったく役に立ちません。

私は最近、私はおそらくあなたがそれを初期化するコンストラクタを持つクラスを作成することによって開始するあなたはos.read()

よりも便利かもしれませんファイルにmmap()を使用する方法を示しました漠然と似た質問hereに、答えファイルポインタ、mmapオブジェクト、およびオフセットのいくつかの組み合わせがあります。

この場合、__init___()メソッドは構造体の内容を解凍してselfという属性を読み込み、初期化します。そして、これらの属性を変更するには、アクセサメソッドを追加し、ここでmmap()またはos.write

バックstruct.packを使用してそれらをすべて書くためsave()方法は、梱包のPythonのドキュメントからの例であり、続く三つの整数(2つの16ビットショートパンツを開梱長い32ビット):あなたのデータは、変数の長さとすることができるように

>>> from struct import * 
>>> pack('=hhl', 1, 2, 3) 
'\x00\x01\x00\x02\x00\x00\x00\x03' 
>>> unpack('=hhl', '\x00\x01\x00\x02\x00\x00\x00\x03') 
(1, 2, 3) 
>>> calcsize('hhl') 
8 

それはあなたの場所でデータを変更することができないかもしれないことを意味する...聞こえます。

ここには、os.read()mmapの両方を使用したPython2の例があります。私は/tmp/three_numbers.datdd if=/dev/zero of=/tmp/three_numbers.dat count=1 bs=1kを事前に作成しました:

関連する問題