2016-11-11 17 views
0

簡単な操作を実行し、Python辞書をcsvファイルに格納してから、後でそのファイルから辞書として読み込みたいと考えています。CSVへの/からのPython辞書の保存と読み込み

私の辞書には、例えば、numpyのアレイのリストに文字列をマップ:

d = {'x': [array([2, 3, 4]), array([5, 6, 7])], 'y': [array([1, 2, 3]), array([4, 5, 6])] 

だから私はCSVファイルとしてこの辞書を保存し、別のプログラムでファイルから辞書を再作成したいと思います。

私は、Pythonのcsvモジュールを使用して辞書をcsvファイルに書き込もうとしましたが、多次元numpy配列のリストを適切に格納するのに問題がありました。モジュールを使用してそれを読み返すと、csvファイルの空の行が読み込まれます。

また、pandasを使用しようとしましたが、read_csv()メソッドを使用して、numpy配列のリストを辞書から読み戻す方法を見つけられませんでした。

+2

csvは使用しないでください。 pickleを使用してください(他のプログラムがpythonプログラムでもある場合は、else:JSONなどを使用してください)。 *編集:* numpy配列のリストだけの場合は、numpys docsを読んでください。[savez](https://docs.scipy.org/doc/numpy/reference/generated/numpy.savez)のような特別な記憶方法があります。 .html) – sascha

+1

@サシャが正しいです。 https://wiki.python.org/moin/UsingPickle –

+0

辞書全体をそのまま読み戻すことができますか? numpy値の中には、より複雑なfloat数があるものもあります。単純化のためintを使用しました。 – user3543300

答えて

2
In [610]: d = {'x': [np.array([2, 3, 4]), np.array([5, 6, 7])], 'y': [np.array(
    ...: [1, 2, 3]), np.array([4, 5, 6])]} 
In [611]: d 
Out[611]: 
{'x': [array([2, 3, 4]), array([5, 6, 7])], 
'y': [array([1, 2, 3]), array([4, 5, 6])]} 

In [613]: np.save('test.npy',d) 
In [614]: np.load('test.npy') 
Out[614]: array({'x': [array([2, 3, 4]), array([5, 6, 7])], 'y': [array([1, 2, 3]), array([4, 5, 6])]}, dtype=object) 

だから辞書にsaveを呼び出し、それがオブジェクト型の配列で辞書をラップして、それを保存します。オブジェクト配列の要素はそれぞれのpickleメソッドで保存されます。だから、それは辞書とその辞書内のリストを漬けます。最後に、リスト内の配列は、np.saveのバージョンで削除されました。ネスティングがたくさんあります。しかし、それは動作します。

そしてitemは、オブジェクト配列のうち、辞書を引くために使用することができます。

In [616]: dd=np.load('test.npy').item() 
In [617]: dd 
Out[617]: 
{'x': [array([2, 3, 4]), array([5, 6, 7])], 
'y': [array([1, 2, 3]), array([4, 5, 6])]} 

直接pickleを使用して:

In [626]: pickle.dump(d, open('test.pkl','wb')) 
In [627]: np.load('test.pkl') 
Out[627]: 
{'x': [array([2, 3, 4]), array([5, 6, 7])], 
'y': [array([1, 2, 3]), array([4, 5, 6])]} 
In [629]: pickle.load(open('test.pkl','rb')) 
Out[629]: 
{'x': [array([2, 3, 4]), array([5, 6, 7])], 
'y': [array([1, 2, 3]), array([4, 5, 6])]} 

をこの辞書からcsvを書くために私が作成したいです'x'と 'y'という名前のフィールドを持つ構造化配列です。しかし、私は配列を連結しなければならないと思うので、私は1d配列を生成することができます。 CSVファイルは、次のようになります。

x y 
2 1 
3 4 
.... 

またはサブアレイはすべて同じ長さをしている場合は、まだCSVのルートを移動したい場合、私はいずれにおいても

x y 
2 5 1 4 
3 6 2 5 
... 

を生成することができるかもしれない

、あなた列の単純な行としてどのように値を表現するかを決める必要があります。

+0

初めてで最も効率的ですか?私はちょうど格納し、辞書をリロードする必要があります、それはCSVである必要はありません – user3543300

関連する問題