将词典字典转换为选项卡文件的最佳方法

时间:2016-05-18 05:24:43

标签: python csv dictionary

将字典字典转换为制表符分隔文件的最pythonic方法是什么?我有下面的脚本,以

的形式生成字典字典
{'name1:[{'AA':2,'GG':3,'CF':10}], name2:[{'AA':4, 'GG':9,'CF':5,'GT':1}]}

我正在寻找一种从那里获得输出的方法,如下所示(tab delimated):

titles   AA  GG  CF  GT
name1    2   3   10  0
name2    4   9   5   1

我还没有找到一种方便的方法。这是我用来从文件中提取频率计数的脚本。

def kmer_counts(b,link):
kmer_dict = {}
values = []
for filename in os.listdir(b):
    if str(filename).endswith(link):
    for record in SeqIO.parse(os.path.join(b, filename), "fasta"):
        id_=record.id
        seq = record.seq
        mylist = kmer_list(seq,4)
        c = collections.Counter(mylist)
        c = dict(c)
        val = list(c.values())
        keys = []
        for key in c:
            keys.append(str(key))
        c_edit = dict(zip(keys,val))
        kmer_dict.setdefault(str(id_),[])
        kmer_dict[str(id_)].append(c_edit)
print kmer_dict

*注意我修改了脚本,因为有人指出它没有输出正确的东西。

1 个答案:

答案 0 :(得分:3)

鉴于您的数据形状不像csv,但这并不是超级优雅的方法,但这并不需要所有那么多代码。

我注意到,如果您的数据如下所示,这会更好一些:

{'name1':{'AA':2,'GG':3,'CF':10}, 'name2':{'AA':4, 'GG':9,'CF':5,'GT':1}}

而不是:

{'name1':[{'AA':2,'GG':3,'CF':10}], 'name2':[{'AA':4, 'GG':9,'CF':5,'GT':1}]}
         ^                       ^          ^                              ^

反正:

import csv
import sys

# your data
data = {'name1':[{'AA':2,'GG':3,'CF':10}], 'name2':[{'AA':4, 'GG':9,'CF':5,'GT':1}]}
topleft = 'titles' # whatever you want the leftmost column header to be

# identify the column headers, and put them in alphabetical order (or some other order, if you'd prefer that)
headers = sorted(set(key
                     for row in data.values()
                     for key in row[0]))

# open a csv writer - this one writes to sys.stdout for interactive convenience
writer = csv.writer(sys.stdout, delimiter='\t')

# write the headers
writer.writerow([topleft] + headers)

for key in data:
    # construct each row
    row = [key] # row header
    for header in headers:
        row.append(data[key][0].get(header, 0)) # use 0 if a given header is absent in a given row
    writer.writerow(row) # write the row

输出:

titles  AA  CF  GG  GT
name1   2   10  3   0
name2   4   5   9   1