2017-03-31 28 views
1

私は何かをPythonを使ってバイナリファイルに書きたいと思っています。バイナリファイルに書き込むpython

私は単純にやっている:

import numpy as np 

f = open('binary.file','wb') 
i=4 
j=5.55 
f.write('i'+'j') #where do i specify that i is an integer and j is a double? 

g = open('binary.file','rb') 
first = np.fromfile(g,dtype=np.uint32,count = 1) 
second = np.fromfile(g,dtype=np.float64,count = 1) 

print first, second 

を出力するだけです: [] []

私は「fwriteの(binary.file、私はMATLABでこれを行うことは非常に簡単です知っています、 'int32'); "、しかし私はPythonでそれをやりたい

+2

ファイルに4と5.55を書き込まないでください。 105(ASCIIコードの「i」)と106(ASCIIコードの「j」)を記述します。 – DyZ

+0

'f.write( 'i' + 'j')'という行は '' ij''という文字列をファイルに書き出しています。データをバイナリとして適切にエンコードするには、[struct.pack](https://docs.python.org/2.7/library/struct.html#struct.pack)を使用します。 –

+0

データをロードするために 'numpy.fromfile'を使用しているので、最も自然なことは' numpy.ndarray.tofile'を使ってデータを保存することです。 (ただし、[docs](https://docs.scipy.org/doc/numpy/reference/generated/numpy。fromfile.html)は、代わりに 'numpy.save'と' numpy.load'を使うことをお勧めします。 –

答えて

2


第1、第2

印刷、[4] []

より神託ファイルハンドラの方法。

'i' + 'j'は、2つの文字列を一緒に追加しています。これにより、文字列ijが生成されます。これは、ファイルに2バイトとして書き込まれる可能性が最も高いです。

変数iは、すでにintです。あなたは(もフロートjに適用されます)いくつかの異なる方法で4バイトの整数としてファイルに書き込むことができます:how to write integer number in particular no of bytes in python (file writing)で説明するように

  1. structモジュールを使用してください。このような何か:

    import struct 
    with open('binary.file', 'wb') as f: 
        f.write(struct.pack("i", i)) 
    

    あなたはjを書くこと'd'指定子を使用します。

  2. 書き込みを行うにはnumpyモジュールを使用します。これは、すでにファイルを読み取っているので便利です。 withブロックでファイルを書くときに両方のケースで、私はコンテキストマネージャとしてopen使用することを

    i = 4 
    j = 5.55 
    with open('binary.file', 'wb') as f: 
        np.array(i, dtype=np.uint32).tofile(f) 
        np.array(j, dtype=np.float64).tofile(f) 
    

注:メソッドndarray.tofileは、まさにこの目的のために作られています。これにより、書き込み中にエラーが発生しても、ファイルが閉じられることが保証されます。

-1

これは、バイナリファイルに文字列(編集済み)を書き込もうとしているためです。ファイルをもう一度読む前に、ファイルを閉じないでください。
あなたは以下のコードを追加し、バイナリファイルしようとするint型や文字列を書きたい場合:

import numpy as np 
import struct 

f = open('binary.file','wb') 
i = 4 
if isinstance(i, int): 
    f.write(struct.pack('i', i)) # write an int 
elif isinstance(i, str): 
    f.write(i) # write a string 
else: 
    raise TypeError('Can only write str or int') 

f.close() 

g = open('binary.file','rb') 
first = np.fromfile(g,dtype=np.uint32,count = 1) 
second = np.fromfile(g,dtype=np.float64,count = 1) 

print first, second  

私は浮動数を把握するためにあなたにそれを残しておきます。あなたはPythonで型に関するいくつかの混乱を持っているように見える

import numpy as np 
import struct 

with open ('binary.file','wb') as f: 
    i = 4 
    if isinstance(i, int): 
     f.write(struct.pack('i', i)) # write an int 
    elif isinstance(i, str): 
     f.write(i) # write a string 
    else: 
     raise TypeError('Can only write str or int') 

with open('binary.file','rb') as g: 
    first = np.fromfile(g,dtype=np.uint32,count = 1) 
    second = np.fromfile(g,dtype=np.float64,count = 1) 

print first, second  
+0

'with open( 'binary.file '、' wb ')をf: '構文として使用した方がよいでしょうか? –

+0

確かに、それはクローズファイルの問題を解決します。私はできるだけ元のコードに近づけようとしていました。編集:オープンで追加... – Artagel

+0

Numpyの 'tofile'と' fromfile'をペアで使うか、 'struct'モジュールを読み書きの両方に使うかのどちらかです。また、彼はファイルに合計を書くのではなく、文字列として '' ij ''を書いていました。 また、これは重複していないとわかりません。 http://stackoverflow.com/questions/37129257/python-writing-int-to-a-binary-file。 –

関連する問題