您好,登錄后才能下訂單哦!
本篇內容介紹了“Python的print輸出重定向舉例分析”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Python中調試程序使用最多的是print(),在使用print()打印時事實上是調用了 sys.stdout.write()。不過print在把內容打印到控制臺后,追加了一個換行符(linefeed)。以下例程中,print和sys.stdout.write()是等價的:
sys.stdout.write('Hello World\n') print('Hello World')
在Python中, sys.stdin、sys.stdout和sys.stderr分別對應解釋器的標準輸入、標準輸出和標準出錯流。在程序啟動時,這些對象的初值由sys.stdin、sys.__stdout__和sys.__stderr__保存,比便于恢復標準流對象。如下所示:
print(sys.stdout) # <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> print(sys.stdin) # <_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'> print(sys.stderr) # <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'> print(sys.__stdout__) # <_io.TextIOWrapper name='<stdout>' mode='w' encoding='UTF-8'> print(sys.__stdin__) # <_io.TextIOWrapper name='<stdin>' mode='r' encoding='UTF-8'> print(sys.__stderr__) # <_io.TextIOWrapper name='<stderr>' mode='w' encoding='UTF-8'>
如果我們要把內容重定向到文本中去時,該如何操作呢?我們先看下普通的文本對象和標準輸出對象的區別。如下所示:
print(dir(sys.stdout)) """ ['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines'] """ with open('redirect.txt', 'w') as f: print(f) # <_io.TextIOWrapper name='redirect.txt' mode='w' encoding='cp1252'> print(dir(f)) """ ['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__', '__eq__', '__exit__', '__format__', '__ge__', '__getattribute__', '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__lt__', '__ne__', '__new__', '__next__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '_checkClosed', '_checkReadable', '_checkSeekable', '_checkWritable', '_finalizing', 'buffer', 'close', 'closed', 'detach', 'encoding', 'errors', 'fileno', 'flush', 'isatty', 'line_buffering', 'mode', 'name', 'newlines', 'read', 'readable', 'readline', 'readlines', 'reconfigure', 'seek', 'seekable', 'tell', 'truncate', 'writable', 'write', 'write_through', 'writelines'] """
可見兩者都屬于文件對象,其中所包含的方法也都相同,比如write、read等等。所以,如果把文件對象的引用賦值給sys.stdout,那么print調用的即為文件對象的write方法,這樣就實現了重定向。其實在之前的Python基礎教程中有跟大家講古。代碼如下所示:
with open('redirect.txt', 'w') as f: sys.stdout = f print("Hello World")
重定向后,print打印的內容就從控制臺搬到了文本上了,如下所示:
如果只是臨時向文件中打印內容,之后仍然會在控制臺上打印的話,應該先將原始的控制臺引用對象保存下來,之后將該引用恢復到sys.stdout中。如下所示:
__console__ = sys.stdout # redirection start # ... # redirection end sys.stdout = __console__
以上的實現方法并不優雅,典型的實現如下所示:
# 臨時把標準輸出重定向到一個文件,然后再恢復正常 with open('redirect.txt', 'w') as f: oldstdout = sys.stdout sys.stdout = f try: help(__import__) finally: sys.stdout = oldstdout print("Hello World")
接下來介紹Pyhton上下文管理器redirect_stdout實現重定向的方法。contextlib.redirect_stdout在Python 3.4加入。如下所示:
with open('redirect.txt', 'w') as f: with contextlib.redirect_stdout(f): help(pow)
當然,其實redirect_stdout的內在實現邏輯也僅是保存控制臺的引用,而后恢復如此而已。于是我們可以實現自己的redirect_stdout上下文管理器。如下所示:
@contextlib.contextmanager def redirect_stdout(fileobj): oldstdout = sys.stdout sys.stdout = fileobj try: yield fileobj finally: sys.stdout = oldstdout def redirect4(): with open('redirect.txt', 'w') as f: with redirect_stdout(f): help(pow) print("Hello World")
“Python的print輸出重定向舉例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。