2013-07-31 115 views
0

我有哪裏字典d:的Python:編寫字典文本文件,命令列

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))。謝謝你們!您的「訂單」變量

回答

0

現在,一個備用,更方便,更高效的這樣的方式,通過精彩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 
+0

雖然這也有效!謝謝! –

+0

歡迎,我愛熊貓;-) –

0

利用驅動發電機部分:

def dict2txt(D, writefile, column1='-', delim='\t', width=20, order=['mix','meow']): 
    import csv 
    # simplify formatting for clarity 
    fmt = lambda s: '{!s:{}}'.format(s, width) 
    with open(writefile, 'w') as f: 
     writer = csv.writer(f, delimiter=delim) 
     writer.writerow([fmt(column1)] + [fmt(s) for s in order]) 
     for i in D.keys(): 
      writer.writerow([fmt(i)] + [fmt(D[i][k]) for k in order]) 

該行仍然是無序的。所以,你可能想是這樣的:「在排序爲我(運行起來也()):」

0

這是我想出了從代碼:

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 order:  
     head.append('{!s:{}}'.format(i,width)) 

    writer.writerow(head) 

    for i in sorted(D.keys()): 
     row = ['{!s:{}}'.format(i,width)] 
     for k in order: row.append('{!s:{}}'.format(D[i][k],width)) 
     writer.writerow(row) 

文件內容:

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