[英]Writing defaultdict(list) to file
Previously asked a question Using defaultdict to parse multi delimiter file 以前问过一个问题使用defaultdict来解析多分隔符文件
While I do get the desired output based on the code, I am struggling to write it to a file as a table in this form 虽然我确实根据代码获得了所需的输出,但我很难将其作为表格中的表格写入文件
count pos _pos _neg
31022550
31022550
31022550
31022550
ids: IDS:
for key, rows in ids.iteritems():
for row in rows:
print '{}\t{}'.format(key, row)
31022550 {'count': '0', 'base': '=', 'pos': '20', '_neg': '0', '_pos': '0'}
31022550 {'count': '2', 'base': 'A', 'pos': '20', '_neg': '0', '_pos': '2'}
31022550 {'count': '0', 'base': 'C', 'pos': '20', '_neg': '0', '_pos': '0'}
31022550 {'count': '1391', 'base': 'G', 'pos': '20', '_neg': '672', '_pos': '719'}
31022550 {'count': '1', 'base': 'T', 'pos': '20', '_neg': '1', '_pos': '0'}
31022440 {'count': '0', 'base': 'N', 'pos': '20', '_neg': '0', '_pos': '0'}
31022550 {'count': '2', 'base': '+A', 'pos': '20', '_neg': '0', '_pos': '2'}
31022551 {'count': '0', 'base': '=', 'pos': '20', '_neg': '0', '_pos': '0'}
31022551 {'count': '960', 'base': 'A', 'pos': '20', '_neg': '464', '_pos': '496'}
31022551 {'count': '0', 'base': 'C', 'pos': '20', '_neg': '0', '_pos': '0'}
31022551 {'count': '13', 'base': 'G', 'pos': '20', '_neg': '9', '_pos': '4'}
31022551 {'count': '0', 'base': 'T', 'pos': '20', '_neg': '0', '_pos': '0'}
31022551 {'count': '0', 'base': 'N', 'pos': '20', '_neg': '0', '_pos': '0'}
31022551 {'count': '288', 'base': '+G', 'pos': '20', '_neg': '117', '_pos': '171'}
31022551 {'count': '9', 'base': '+GG', 'pos': '20', '_neg': '4', '_pos': '5'}
31022551 {'count': '1', 'base': '+GGG', 'pos': '20', '_neg': '0', '_pos': '1'}
with open('mycsvfile.csv', 'w') as f:
writer = csv.writer(f)
for k, v in ids.iteritems():
writer.writerow([k] + v)
I would do this (python 2): 我会这样做(python 2):
with open('mycsvfile.csv', 'wb') as f: # binary is better, avoids blank lines in some python 2 versions
writer = csv.writer(f,delimiter="\t")
keys=["count","pos","_pos","_neg"]
writer.writerow([""]+keys)
for k, vl in ids.iteritems():
for v in vl:
writer.writerow([k] + [v[key] for key in keys])
you need a double loop to iterate on the lists for each key. 你需要一个双循环来迭代每个键的列表。 I have stored the column names in a list, so I can reuse it to build the rows in a list comprehension & for the title as well (first item doesn't have a title, I just left it blank) 我已经将列名存储在一个列表中,所以我可以重用它来构建列表理解中的行以及标题(第一项没有标题,我只是把它留空)
now it looks like this: 现在它看起来像这样:
count pos _pos _neg
31022550 0 20 0 0
31022550 2 20 2 0
31022550 0 20 0 0
(slightly shifted because tab character isn't wide enough, but not an issue to read it back) (稍微移位,因为制表符不够宽,但读回来不是问题)
Python 3 users would have to change: Python 3用户必须更改:
with open('mycsvfile.csv', 'wb') as f:
by 通过
with open('mycsvfile.csv', 'w',newline="") as f:
and 和
for k, vl in ids.iteritems():
by 通过
for k, vl in ids.items(): # also works in python 2
note that the writerow
double loop could be replaced by a single line, a double-loop, flat generator comprehension passed to writerows
, faster to execute: 请注意, writerow
双循环可以替换为单行,双循环,平面生成器理解传递给writerows
,执行速度更快:
writer.writerows([k] + [v[key] for key in keys] for k, vl in ids.items() for v in vl)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.