我有一个名为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
答案 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