Как напечатать текст в поле звездочек в выходном файле? - PullRequest
0 голосов
/ 13 октября 2019

Я работаю над следующим вопросом hw и сейчас просто пытаюсь настроить мой код ...

Напишите программу, которая принимает файл, которыйесть сообщение. Сообщение может быть любой длины.

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

Входной файл должен быть просто однострочным сообщением (см. Прилагаемый пример ввода),Выходные данные должны принять это сообщение, разбить его на две строки и центрировать в поле

Это мой текущий код:

import textwrap

def func1():
    infile=open("october.txt", "r")
    'Pull text from file and assign it to process_contents variable'
    process_contents=infile.read()
    return process_contents


def asterisk_box(width, height):
    'Create a box of asterisks and return it as a string'
    box = '*' * width + '\n'
    for i in range(height - 2):
        box += '*' + ' ' * (width-2) + '*\n'
    box += '*' * width
    return box

def asterisk_message(width, height, message):
    'Put a message within the asterisk box'
    assert len(message) <= height  # Make sure there is room for a message
    assert len(message) <= width  # Make sure the box is wide enough
    box = asterisk_box(25,20)
    box = box.splitlines()
    row = height // 2
    box[row] = "*" + message.center(width) + "*"
    box[row] = textwrap.fill(message,4)
    return '\n'.join(box)


def func2():
    outfile=open("october_output.txt", "w")
    print(asterisk_message(30,25, func1()), file=outfile)
    outfile.close()



func2()


код, который я имею, будет работать только с очень маленьким словом типа "привет";с любым более длинным сообщением включается «assert» и код не запускается. Можно ли как-нибудь сделать так, чтобы поле звездочек автоматически расширялось или сжималось в зависимости от длины моего сообщения? Я пытался использовать textwrap, чтобы сжать более длинные сообщения, чтобы они поместились в поле, но из-за этого у меня возникло странное форматирование, и я испортил поле звездочки, например:


*************************
*                       *
*                       *
*                       *
*                       *
*                       *
*                       *
*                       *
*                       *
*                       *
*                       *
*                       *
so l
et's
try 
long
er?
*                       *
*                       *
*                       *
*                       *
*                       *
*                       *
*************************

1 Ответ

0 голосов
/ 13 октября 2019
width = 30
message = "This is a test"
msg_ary = message.split(' ')
message1 = ' '.join(msg_ary[0: len(msg_ary) // 2]).center(width, ' ')
message2 = ' '.join(msg_ary[len(msg_ary) // 2:]).center(width, ' ')

print('*' * (width + 4))
print(f'* {message1} *')
print(f'* {message2} *')
print('*' * (width + 4))

> **********************************
> *            This is             *
> *             a test             *
> **********************************

Так как это домашнее задание, некоторые объяснения:

width = 30 : Просто произвольная ширина, которую я выбрал, настолько, насколько она соответствует вашему тексту.
msg_ary = ...... : разделить сообщение словами (пробелами), чтобы сделать разрыв, чтобы не разбить слово
messag1 = ...., message2 = ... . : снова сделать массив в предложении, обратите внимание на удобный вызов "center" в конце:)

...