Как записать в файл несколько переменных с одинаковым форматом? - PullRequest
1 голос
/ 24 мая 2019

У меня есть матрица с именем 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 ]

1 голос
/ 24 мая 2019

Я думаю, что вы на правильном пути - и вот как это сделать:

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
1 голос
/ 24 мая 2019

Хотя используется [Scipy.Docs]: numpy.savetxt ( fname, X, fmt = '%. 18e', delimiter = '', newline = '\ n' , header = '', footer = '', comments = '#', encoding = None ) будет рекомендуемым способом, также возможно использование форматирования Python . Обратите внимание, что я предположил, что это массив NumPy из-за фрагментов кода, подобных len(t[:][i]), но код будет работать так же и для матрицы Python .

Ссылка [Python 3.Docs]: строка - Форматировать синтаксис строки .

Есть 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

Примечание : 2 нежелательные строки на выходе являются возвращаемым значением result.write (количество записанных char s), которое автоматически печатается.

0 голосов
/ 24 мая 2019

Я бы предложил 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...