Как записать в файл.txt с выравниванием текста по левому краю в python?

Я пытаюсь записать данные в текстовый файл в цикле for, используя код [python]:

f = open('top_5_predicted_class.txt', 'w')
    f.write('Predicted Classes' + '\t\t' + ' Class Index' + '\t' + ' Probability' + '\n\n')

    for i in range(0, 5):
        f.write("%s \t \t %s \t \t %s \n" % (labels[top_k][i], top_k[i], out['prob'][0][top_k][i]) )
    f.close()

Но результат, который я получил, оказался не таким, как я ожидал. Я хочу, чтобы индекс класса был выровнен по левому краю, а также вероятности.

выход

Есть идеи, как мне это сделать? Я предполагаю, что проблема существует, потому что длина предсказанных классов не фиксирована.

2 ответа

Решение

Вы не должны использовать вкладки для такого рода выравнивания, так как поведение непредсказуемо, когда ваши входные данные имеют различную длину. Если вы знаете, какова максимальная длина каждого столбца, вы можете использовать format функция для заполнения пробелами. В моем примере я использую 15 пробелов:

>>> for a,b,c in [('a','b','c'), ('d','e','f')]:
...     print ("{: <15} {: <15} {: <15}".format(a, b, c))
...
a               b               c
d               e               f

Это чисто о дисплее, хотя. Если вы беспокоитесь о сохранении данных, было бы гораздо лучше использовать формат CSV, например, в Python csv модуль.

Вы можете просмотреть ваши данные и получить максимальную ширину поля, а затем использовать их для выравнивания всего:

data = [
    ['tabby, tabby cat', 281, 0.312437],
    ['tiger cat', 282, 0.237971],
    ['Egyption cat', 285, 0.123873],
    ['red fox, Vulpes vulpes', 277, 0.100757],
    ['lynx, catamount', 287, 0.709574]
]

max_class_width = len('Predicted Classes')
max_index_width = len('Class Index')
max_proba_width = len('Probability')

for entry in data:
    max_class_width = max(max_class_width, len(entry[0]))
    max_index_width = max(max_index_width, len(str(entry[1])))
    max_proba_width = max(max_proba_width, len(str(entry[2])))

print "{1:<{0}s}  {3:<{2}s}  {5:<{4}}".format(max_class_width, 'Predicted Classes',
                                              max_index_width, 'Class Index',
                                              max_proba_width, 'Probability')

for entry in data:
    print "{1:<{0}s}  {3:<{2}s}  {5:<{4}}".format(max_class_width, entry[0],
                                                  max_index_width, str(entry[1]),
                                                  max_proba_width, str(entry[2]))

Выход

Predicted Classes       Class Index  Probability
tabby, tabby cat        281          0.312437   
tiger cat               282          0.237971   
Egyption cat            285          0.123873   
red fox, Vulpes vulpes  277          0.100757   
lynx, catamount         287          0.709574   

Вы можете использовать также использовать printf стиль форматирования:

print "%-*s  %-*s  %-*s" % (max_class_width, 'Predicted Classes',
                            max_index_width, 'Class Index',
                            max_proba_width, 'Probability')

for entry in data:
    print "%-*s  %-*s  %-*s" % (max_class_width, entry[0],
                                max_index_width, str(entry[1]),
                                max_proba_width, str(entry[2]))
Другие вопросы по тегам