[英]Python: Write dictionary to text file with ordered columns
I have a dictionary D where: 我有字典D,其中:
D = {'foo':{'meow':1.23,'mix':2.34}, 'bar':{'meow':4.56, 'mix':None}, 'baz':{'meow':None,'mix':None}}
I wrote this code to write it to a text file: 我编写了以下代码以将其写入文本文件:
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)
But the output ignores order = ['mix','meow']
and writes the file like: 但是输出忽略
order = ['mix','meow']
并将文件写入如下:
- meow mix
bar None 4.56
foo 2.34 1.23456
baz None None
How do I get it to write: 我如何写:
- mix meow
bar 4.56 None
foo 1.23456 2.34
baz None None
Thanks! 谢谢!
Update: Thanks to @SukritKalra in the comments below for pointing out that the code works fine. 更新:感谢@SukritKalra在下面的注释中指出该代码可以正常工作。 I just wasn't reordering the column headers!
我只是没有重新排序列标题!
The line for i in D[D.keys()[0]].keys(): head.append('{!s:{}}'.format(i,width))
should read for i in order: head.append('{!s:{}}'.format(i,width))
. 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))
。 Thanks folks! 谢谢大家!
Now, an alternate, easier and more efficient way of doing this, by using the wonderful Pandas library 现在,使用精彩的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")
Result: 结果:
$ python test1.py
$ cat foo.txt
mix meow
bar none 4.56
baz none none
foo 2.34 1.23
Take advantage of your "order" variable to drive some generators: 利用您的“ 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])
The rows are still unordered. 这些行仍然是无序的。 So you might want something like: "for i in sorted(D.keys()):"
因此,您可能想要类似:“ for sorted(D.keys())中的我:”
This is what I came up with from your code: 这是我从您的代码中得出的:
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)
File content: 档案内容:
- mix meow
bar None 4.56
baz None None
foo 2.34 1.23
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.