class ColumnWriter(object):
def __init__(self, columns):
columns = (-1, ) + tuple(columns)
widths = (c2 - c1 for c1, c2 in zip(columns, columns[1:]))
format_codes = ("{" + str(i) + ":>" + str(width) +"}"
for i, width in enumerate(widths))
self.format_string = ''.join(format_codes)
def get_row(self, values):
return self.format_string.format(*values)
cw = ColumnWriter((1, 20, 21))
print cw.get_row((1, 2, 3))
print cw.get_row((1, 'a', 'a'))
если вам нужно, чтобы столбцы менялись от строки к строке, то вы можете сделать один вкладыш.
import itertools
for columns in itertools.combinations(range(10), 3):
print ColumnWriter(columns).get_row(('.','.','.'))
Это ослабляет проверку ошибок.Необходимо проверить, что columns
отсортировано и что len(values) == len(columns)
.
У него есть проблемы со значением, превышающим область, выделенную для его хранения, но я не уверен, что с этим делать.В настоящее время, если это происходит, он перезаписывает предыдущий столбец.пример:
print ColumnWriter((1, 2, 3)).get_row((1, 1, 'aa'))
Если у вас есть итерация строк, которые вы хотите записать в файл, вы можете сделать что-то вроде этого
rows = [(1, 3, 4), ('a', 'b', 4), ['foo', 'ten', 'mongoose']]
format = ColumnWriter((20, 30, 50)).get_row
with open(filename, 'w') as fout:
fout.write("\n".join(format(row) for row in rows))