2017-12-26 30 views
0

私が使用しているコード(Pythonではなく)は、特定の方法で記述された入力ファイルを受け取ります。私は通常、このような入力ファイルをPythonスクリプトで準備します。それらのうちの1つは、以下のフォーマットをとる。pythonのprint関数とnumpy.savetxt 3

ここで、100は全体的なパラメータであり、残りは行列である。 Python 2では、私は次のようにしていました。

# python 2.7 
import numpy as np 
Matrix = np.arange(9) 
Matrix.shape = 3,3 
f = open('input.inp', 'w') 
print >> f, 100 
np.savetxt(f, Matrix) 

私はちょうど最近python 3に変換されました。 numpy.savetxtの実行中にfh.write(asbytes(format % tuple(row) + newline))のようなものがあるので、私が得た最初のエラーがTypeError: write() argument must be str, not bytes

# python 3.6 
import numpy as np 
Matrix = np.arange(9) 
Matrix.shape = 3,3 
f = open('input.inp', 'w') 
print(100, file=f) 
np.savetxt(f, Matrix) 

:2to3はとスクリプト上で実行すると、私のようなものを取得します。ファイルをバイナリとして開くことでこの問題を解決できました:f = open('input.inp', 'wb')しかし、これによりprint()が失敗することになります。これら2つを調和させる方法はありますか?

+1

現在のPythonバージョンで動作するようにNumpyビルドをお持ちですか? –

+0

良い質問です。私はPythonパッケージを管理するためにAnacondaを使用しています。 Python 3に変換するとき、私はpython 3.6で新しい環境を作りました。そして、新しい環境に 'conda install numpy'のようなものをすべてインストールしました。これで十分ですか? – Fxyang

+0

'savetxt'はファイルを 'wb'で開き、すべての文字列を' np.asbytes'に渡します。これはすべてのユニコード文字列で '.encode( 'latin1')'を行います。この考え方は、Py2スタイルの出力を維持することです。コードは読みやすいPythonです。 – hpaulj

答えて

1

私はこの同じ問題をpython3に変換しました。 Python3のすべての文字列はデフォルトでUnicodeとして解釈されるため、変換する必要があります。最初に文字列に書き込むという解決策を見つけ、その文字列をファイルに書き込んで最も魅力的なものにしました。これはpython3で、このメソッドを使ったスニペットの作業バージョンです:

# python 3.6 
from io import BytesIO 
import numpy as np 
Matrix = np.arange(9) 
Matrix.shape = 3,3 
f = open('input.inp', 'w') 
print(100, file=f) 
fh = BytesIO() 
np.savetxt(fh, Matrix, fmt='%d') 
cstr = fh.getvalue() 
fh.close() 
print(cstr.decode('UTF-8'), file=f)