используя оператор Python с 'с помощью sys.stdout

Я всегда открываю и записываю файлы, используя оператор:

 with open('file_path', 'w') as handle: print >>handle, my_stuff 

Однако есть один случай, когда мне нужно быть более гибким и писать в sys.stdout (или другие типы потоков), если это предусмотрено вместо пути к файлу:

Итак, мой вопрос заключается в следующем: есть ли способ использовать with заявлением как с реальными файлами, так и с sys.stdout ?

Обратите внимание, что я могу использовать следующий код, но я думаю, что это побеждает цель использования with :

 if file_path != None: outputHandle = open(file_path, 'w') else: outputHandle = sys.stdout with outputHandle as handle: print >>handle, my_stuff 

Вы можете создать менеджер контекста и использовать его так

 import contextlib, sys @contextlib.contextmanager def file_writer(file_name = None): # Create writer object based on file_name writer = open("Output.txt", "w") if file_name is not None else sys.stdout # yield the writer object for the actual use yield writer # If it is file, then close the writer object if file_name != None: writer.close() with file_writer("Output.txt") as output: print >>output, "Welcome" with file_writer() as output: print >>output, "Welcome" 

Если вы не передадите какой-либо вход в file_writer он будет использовать sys.stdout .

Дело в том, что вам не нужно использовать процессор контекста с stdout , потому что вы не открываете и не закрываете его. Менее причудливым способом абстрагирования этого является:

 def do_stuff(file): # Your real code goes here. It works both with files or stdout return file.readline() def do_to_stdout(): return do_stuff(sys.stdout) def do_to_file(filename): with open(filename) as f: return do_stuff(f) print do_to_file(filename) if filename else do_to_stdout() 

Самый простой способ – просто использовать «старые школьные» потоковые имена файлов, таким образом ваш код не должен меняться. В Unix это «/ dev / tty» или в Windows это «con» (хотя для обеих платформ есть другие варианты).

 if default_filename is None: default_filename = "/dev/tty" with open(default_filename, 'w') as handle: handle.write("%s\n" % my_stuff) 

Этот код протестирован в Python 2.7.3 и 3.3.5