Как записать в файл.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]))