如何在文件的一行中写入多个具有相同格式的变量?

时间:2019-05-23 22:57:47

标签: python format

我有一个名为t的矩阵。我想将其逐行写入文本文件。而且,矩阵中的每个元素都具有相同的格式,例如10.3f。问题在于每一行都有48个我不能明确编写的元素。

我尝试使用{f}*{}

for i in range(len(t[0][:])) :
    result.write( "'{8.3f}'*{per}\n".format( t[:][i],per=len(t[:][i]) ) )

我得到如下错误:

IndexError: tuple index out of range

3 个答案:

答案 0 :(得分:1)

尽管建议使用[Scipy.Docs]: numpy.savetxt(fname, X, fmt='%.18e', delimiter=' ', newline='\n', header='', footer='', comments='# ', encoding=None),但也可以使用 Python 格式。请注意,由于len(t[:][i])之类的代码,我假设它是一个 NumPy 数组,但是该代码对于 Python 矩阵也将起作用。

引用[Python 3.Docs]: string - Format String Syntax

有3个问题:

示例(我也整理了一下代码):

>>> import sys
>>> import numpy as np
>>>
>>> t = np.array([[1, 2, 3, 4], [5, 6, 7, 8, 9]])
>>>
>>> result = sys.stdout  # Use stdout to mimic file write
>>>
>>> for line in t:
...     result.write(("{:8.3f}" * len(line) + "\n").format(*line))
...
   1.000   2.000   3.000   4.000
33
   5.000   6.000   7.000   8.000   9.000
41

注意:输出中不需要的两行是result.write的返回值(写入的 char 的数量),该值会自动打印出来。 / p>

答案 1 :(得分:1)

我认为您处在正确的轨道上,这是使该工作正常进行的方法:

import sys

result = sys.stdout

t = [[3, 1.2, 3.45, 6.789],
     [863.202, 730.2, 833.67]]

for row in t:
    fmtspec = '{:8.3f}' * len(row)
    result.write(fmtspec.format(*row) + '\n')

输出:

   3.000   1.200   3.450   6.789
 863.202 730.200 833.670

如果所有行的长度都相同,则只需创建一次格式规范即可:

t2 = [[3, 1.2, 3.45, 6.789],
     [863.202, 730.2, 833.67, 23.1456]]

fmtspec = '{:8.3f}' * len(t2[0])  # Use length of first row.
for row in t2:
    result.write(fmtspec.format(*row) + '\n')
   3.000   1.200   3.450   6.789
 863.202 730.200 833.670  23.146

答案 2 :(得分:0)

我建议使用DictWriter

其他选项与先前给出的类似:

import os
FORMAT = "{:10.3f}"

t = [ [123, 1.2, 3.45, 6.789],
    [3863.202, 730.2, 833.67],
    [863.202, 7230.2, 833.67], ]

def numbers_to_line(*args):
    template = FORMAT * len(args) + os.linesep
    return template.format(*args)

with open("result.txt", "w") as fh:
    for row in t:
        fh.write(numbers_to_line(*row))

和输出:

   123.000     1.200     3.450     6.789
  3863.202   730.200   833.670
   863.202  7230.200   833.670