0

私は辞書Dを持っています:

D = {'foo':{'meow':1.23,'mix':2.34}, 'bar':{'meow':4.56, 'mix':None}, 'baz':{'meow':None,'mix':None}}

テキストファイルに書き込むためにこのコードを書きました:

def dict2txt(D, writefile, column1='-', delim='\t', width=20, order=['mix','meow']):
  import csv
  with open( writefile, 'w' ) as f:
    writer, w = csv.writer(f, delimiter=delim), []
    head = ['{!s:{}}'.format(column1,width)]
    for i in D[D.keys()[0]].keys(): head.append('{!s:{}}'.format(i,width))
    writer.writerow(head)
    for i in D.keys():
      row = ['{!s:{}}'.format(i,width)]
      for k in order: row.append('{!s:{}}'.format(D[i][k],width))
      writer.writerow(row)

ただし、出力はファイルを無視order = ['mix','meow']して次のように書き込みます。

-       meow    mix    
bar     None    4.56   
foo     2.34    1.23456
baz     None    None

どうすればそれを書くことができますか:

-       mix     meow    
bar     4.56    None   
foo     1.23456 2.34
baz     None    None

ありがとう!

更新: コードが正常に動作することを指摘してくれた以下のコメントの @SukritKalra に感謝します。列ヘッダーを並べ替えていませんでした。

for i in D[D.keys()[0]].keys(): head.append('{!s:{}}'.format(i,width))for i in order: head.append('{!s:{}}'.format(i,width)). ありがとう!

4

3 に答える 3

1

さて、素晴らしいPandasライブラリを使用して、これを行うための代替の、より簡単で効率的な方法

import pandas as pd

order=['mix', 'meow']
D = {'foo':{'meow':1.23,'mix':2.34}, 'bar':{'meow':4.56, 'mix':None}, 'baz':{'meow':None,'mix':None}}

df = pd.DataFrame(D).T.reindex(columns=order)

df.to_csv('./foo.txt', sep='\t', na_rep="none")

結果:

$ python test1.py
$ cat foo.txt
        mix     meow
bar     none    4.56
baz     none    none
foo     2.34    1.23
于 2013-07-31T19:51:03.147 に答える