python中生成的文本文件格式错误

时间:2014-12-29 21:03:12

标签: python text

  

我有一个很大的父列表,其中包含许多元组列表,如小例子:

[
[('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

3 个答案:

答案 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))