我有一个很大的父列表,其中包含许多元组列表,如小例子:
[ [('id', 'name', 'Trans'), ('ENS001', 'EGSB', 'TTP')], [('id', 'name', 'Trans'), ('EN02', 'EHGT', 'GFT')] ]
我的目标是创建一个文本文件,其中包含一些列。列是 父列表中每个列表的第二个元组。所有列表中的第一个元组都是相似的 在所有嵌套列表中,它们都是列名。
我使用了这段代码(z在列表上方)
rows= [i[1] for i in z]
获取
[('ENS001', 'EGSB', 'TTP'), ('EN02', 'EHGT', 'GFT')]
这一个(我称之为“A”)
with open('out.txt','w') as f : f.write (' '.join(z[0][0])) for i in rows: f.write (' '.join(i))
获取文件。但是在文件中,列不会像这样分开。
id name Trans
ENS001 EGSB TTP
EN02 EHGT GFT
答案 0 :(得分:2)
您正在一行编写所有内容,需要添加换行符:
rows = (sub[1] for sub in z)
with open('out.txt','w') as f:
f.write ("{}\n".format(' '.join(z[0][0]))) # add a newline
for i in rows:
f.write ("{}\n".format(' '.join(i))) # newline again
如果您的行中始终有三个元素,并且您希望它们对齐:
rows = [sub[1] for sub in z]
mx_len = 0
for tup in rows:
mx = len(max(tup[:-1],key=len))
if mx > mx_len:
mx_len = mx
with open('out.txt', 'w') as f:
a, b, c = z[0][0]
f.write("{:<{mx_len}} {:<{mx_len}} {}\n".format(a, b, c, mx_len=mx_len))
for a, b, c in rows:
f.write("{:<{mx_len}} {:<{mx_len}} {}\n".format(a, b, c, mx_len=mx_len))
输出:
id name Trans
ENS001 EGSB TTP
EN02 EHGT GFT
如果长度不同:
with open('out.txt', 'w') as f:
f.write(("{:<{mx_len}}"*len(z[0][0])).format(*z[0][0], mx_len=mx_len) + "\n")
for row in rows:
f.write(("{:<{mx_len}}"*len(row)).format(*row, mx_len=mx_len) + "\n")
答案 1 :(得分:1)
如果要将列与空格对齐,首先必须确定每列的宽度 - 可能是每个列的长标题或内容的长度,例如:
wids = [len(h) for h in z[0][0]]
for i in rows:
wids = [max(len(r), w) for w, r in zip(wids, i)]
然后在此基础上,您可以准备格式字符串,例如
fmt = ' '.join('%%%ds' % w for w in wids) + '\n'
最后,你可以写出来:
with open('out.txt','w') as f:
f.write(fmt % z[0][0])
for i in rows:
f.write(fmt % i)
答案 2 :(得分:0)
如果您希望输出由this等标签分隔,则可以加入\t
,而不是您正在使用的' '
。代码的底线看起来像f.write('\t'.join(i))
。