91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python的print輸出重定向舉例分析

發布時間:2021-11-19 15:04:55 來源:億速云 閱讀:254 作者:iii 欄目:編程語言

本篇內容介紹了“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打印的內容就從控制臺搬到了文本上了,如下所示:

Python的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")

Python的print輸出重定向舉例分析

接下來介紹Pyhton上下文管理器redirect_stdout實現重定向的方法。contextlib.redirect_stdout在Python 3.4加入。如下所示:

with open('redirect.txt', 'w') as f:
    with contextlib.redirect_stdout(f):
        help(pow)

Python的print輸出重定向舉例分析

當然,其實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輸出重定向舉例分析”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

崇信县| 庆元县| 应城市| 揭阳市| 拉孜县| 五华县| 开化县| 济源市| 莆田市| 布尔津县| 双柏县| 南漳县| 朝阳县| 夏河县| 磐安县| 镇安县| 翼城县| 通河县| 蓬安县| 大同市| 恩平市| 汉川市| 涡阳县| 惠安县| 陆丰市| 上饶县| 宁国市| 石景山区| 库伦旗| 博客| 铜梁县| 马尔康县| 蒙阴县| 天津市| 石阡县| 依安县| 洛隆县| 永嘉县| 泾川县| 尉氏县| 贡嘎县|