Создайте и распечатайте в новый файл, если файл указан, иначе просто std.out - PullRequest
0 голосов
/ 05 марта 2019

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

Я получил его для идеальной печати на экране, но не могу понять, как создать файл и распечатать на нем карточку бинго.Я знаю, что могу использовать open(file) as f и f.write, но когда я это сделал, все время появлялись ошибки, и я больше не мог печатать на стандартный вывод.

Есть какие-нибудь предложения о том, как это сделать?Это код, мой учитель указал имена функций, я просто должен заполнить код, как это сделать.Я называю это с test.print().

def print(self, file=sys.stdout):
    """void function:
    Prints a card to the screen or to an open file object"""
    # if file == sys.stdout:
    #     f = sys.stdout
    # else:
    #     f = open(str(file), 'w+')
    tableCorner = "+"
    tableMiddle = "-----"
    tableSide = "|"
    total = 0
    row = 0
    print("\nCard #" + str(self.getId()))
    while row < self.size:
        # prints horizontal divider
        while total < self.size:
            print(tableCorner + tableMiddle, end="")
            total += 1
        print(tableCorner)
        total = 0
        # prints line with numbers
        while total < self.size:
            print(tableSide + str(self.card.getNext()).center(5, " "), end="")
            total += 1
        print(tableSide)
        total = 0
        row += 1
    while total < self.size:
        print(tableCorner + tableMiddle, end="")
        total += 1
    print(tableCorner)

1 Ответ

0 голосов
/ 05 марта 2019

Вместо установки sys.stdout в качестве параметра по умолчанию попробуйте:

def print(self, file=None):
    if not file is None:
        sys.stdout = open(file)

и оставьте остальной код таким же.Установка sys.stdout в качестве объекта файла приведет к тому, что печать закончится там вместо обычного stdout.Имейте в виду, что использование open вне блока with обычно не рекомендуется, поэтому вы можете реструктурировать вещи соответствующим образом.

EDIT: две вещи: 1. Я сделал небольшую демонстрацию, чтобы показать, что происходит, когда вы устанавливаетеsys.stdout для файлового объекта:

In [1]: import sys                                                              

In [2]: print('some BODY once told me')                                         
some BODY once told me

In [3]: sys.stdout = open('test.txt','w')                                       
In [4]: print('some BODY once told me')                                         
In [5]: sys.stdout = sys.__stdout__                                             

In [6]: with open('test.txt','r') as f: 
   ...:     print(f.read()) 
   ...:                                                                         

some BODY once told me

Как видите, без изменений sys.stdout печать возвращается в консоли ipython.После изменения его в файл с именем text.txt он заканчивается там и проверяется путем помещения sys.stdout обратно в оригинал, который задается sys.__stdout__, и распечатывания содержимого файла.

Возможно, вам не нужно беспокоиться об использовании блока with.Попытка закрыть sys.stdout после установки его равным объекту файла вызвала ошибку:

Traceback (последний вызов был последним): файл "/ home / finchj / Programs / anaconda3 / envs / finchj/ bin / ipython ", строка 11, в файле sys.exit (start_ipython ())" /home/finchj/programs/anaconda3/envs/finchj/lib/python3.6/site-packages/IPython/init .py ", строка 125, в start_ipython возвращает файл launch_new_instance (argv = argv, ** kwargs) Файл" /home/finchj/programs/anaconda3/envs/finchj/lib/python3.6/site-packages/traitlets/config/application.py ", строка 658, в файле launch_instance app.start ()" /home/finchj/programs/anaconda3/envs/finchj/lib/python3.6/site-packages/IPython/terminal/ipapp.py ",строка 356, в стартовом файле self.shell.mainloop () файл "/home/finchj/programs/anaconda3/envs/finchj/lib/python3.6/site-packages/IPython/terminal/interactiveshell.py", строка 498, вmainloop self.interact () Файл "/home/finchj/programs/anaconda3/envs/finchj/lib/python3.6/site-packages/IPython/terminal/interactiveshell.py", line 478, в интерактивной печати (self.separate_in, end = '') ValueError: операция ввода-вывода для закрытого файла.

Приводит меня к подозрению, что очистка выполняется негласно, хотя я не могу подтвердить, что этодело в это время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...