簡體   English   中英

Python:將字典寫入具有順序列的文本文件

[英]Python: Write dictionary to text file with ordered columns

我有字典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))讀取for i in order: head.append('{!s:{}}'.format(i,width)) 謝謝大家!

現在,使用精彩的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

利用您的“ order”變量來驅動一些發電機:

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])

這些行仍然是無序的。 因此,您可能想要類似:“ for sorted(D.keys())中的我:”

這是我從您的代碼中得出的:

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                

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM