Python:使用有序列将字典写入文本文件
我有一本字典D,其中:Python:使用有序列将字典写入文本文件,python,text,dictionary,Python,Text,Dictionary,我有一本字典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( write
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
谢谢
更新:感谢@Sukritkalla在下面的评论中指出代码工作正常。我只是没有重新排列列标题
D[D.keys()[0]].keys():head.append('{!s:{}}.format(i,width))中i的行应为,顺序为:head.append('{!s:{}.format(i,width))
。谢谢大家 利用“订单”变量驱动一些发电机:
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 i in 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
现在,一个替代的,更简单和更有效的方法,通过使用奇妙的库
结果:
$ python test1.py
$ cat foo.txt
mix meow
bar none 4.56
baz none none
foo 2.34 1.23
欢迎,我爱熊猫;-)
$ python test1.py
$ cat foo.txt
mix meow
bar none 4.56
baz none none
foo 2.34 1.23