1

私はPythonが初めてで、これに対する解決策がありますが、遅くてばかげているように見えるので、もっと良い方法があるかどうか疑問に思いましたか?

次のように定義された行列があるとします。

mat = [['hello']*4 for x in xrange(3)]

この関数を使用してファイルに書き込みます:

def writeMat(mat, outfile):
  with open(outfile, "w") as f:
    for item in mat:
      f.writelines(str(item).replace('[','').replace(',','').replace('\'','').replace(']','\n'))

writeMat(mat, "temp.txt")

次のようなテキスト ファイルが生成されます。

hello hello hello hello
hello hello hello hello
hello hello hello hello

私が扱っているファイルは非常に大きいです。numpyのsavetxt関数は素晴らしいでしょうが、これを numpy 配列として保存したくありません。マトリックスの大部分は単一の文字要素で構成されていますが、最初の数列の長さは多くの文字になるため、私(間違っている場合は訂正してください)これは、マトリックス内のすべての要素が最大要素のサイズになるため、マトリックス全体が必要以上に多くのメモリを使用することを意味します。

4

2 に答える 2

2

あなたの質問を正しく理解できれば、次のことができます。

f.writelines(' '.join(row) + '\n' for row in mat)

また

f.write('\n'.join(' '.join(row) for row in mat))

最初のものには、現在の行の連結された文字列のコピーのみを作成するジェネレータ式であるという利点があります

また、行列のエントリが文字列でない場合は、次のようにすることができます。

f.writelines(' '.join(str(elem) for elem in row) + '\n' for row in mat)

編集

このfile.writelines()メソッドは、ファイルに書き込む前にジェネレータ式全体を評価しているようです。したがって、次のようにすると、メモリ消費が最小限に抑えられます。

for row in mat:
    f.write(' '.join(row) + '\n')
于 2012-07-21T05:10:15.513 に答える
1

csvモジュールを使用できます:

import csv

with open(outfile, 'wb') as f:
     csv.writer(f, delimiter=' ').writerows(mat)
于 2012-07-21T05:30:40.003 に答える