python的print与sys.stdout

python的print与sys.stdoutprint 与 sys stdout 在 python 中 print 语句实现打印 从技术角度来说 这是把一个或多个对象转换为其文本表达式形式 然后发送给标准输出流或者类似的文件流 更详细的说 打印与文件和流的概念紧密相连 我们都知道在 python 中 向一个文件写东西是通过类似 file write str 方法实现的 而你可能没想到 print 语句执行的操作其实也是一个写操作 不过他把我们从外设输入的



print与sys.stdout

python中,print语句实现打印,从技术角度来说,这是把一个或多个对象转换为其文本表达式形式,然后发送给标准输出流或者类似的文件流,更详细的说,打印与文件和流的概念紧密相连。

我们都知道在python中,向一个文件写东西是通过类似file.write(str)方法实现的,而你可能没想到print语句执行的操作其实也是一个写操作,不过他把我们从外设输入的数据写到了stdout流,并进行了一些特定的格式化。当然,和文件方法不通,在执行打印操作是,不需要将对象转换为字符串(print已经帮我们做好了)。

print 123 

等价于

import sys sys.stdout.write(str(123)+'\n') 

这里的sys.stdout也就是我们python中标准输出流,这个标准输出流默认是映射到打开脚本的窗口的,所以,我们的print操作会把字符打印到屏幕上。既然sys.stdout默认是映射到打开脚本的窗口,那么这个映射关系是否可以修改呢?

答案是肯定的,这也是python中常用的一个小技巧,我们可以通过修改这种映射关系来把我们的打印操作重定向到其它地方,例如特定的文件。方法就是给sys.stdout赋值,修改它的指向。看下面的例子:

import sys sys.stdout = open('test.txt','w') print 'Hello world' 

所以,这就需要我们先保存原始的sys.stdout,后面想要恢复的时候再赋值就行了,实现如下:

import sys temp = sys.stdout sys.stdout = open('test.txt','w') print 'hello world' sys.stdout = temp #恢复默认映射关系 print 'nice' 

sys.stdout除了可以映射到一个文件外,还有什么可以做的吗?当然有的,你甚至可以将sys.stdout赋值为一个自定义的对象,前提是这个对象实现了write方法。毕竟print调用的就是sys.stdout.write()方法。你可以自定义write方法,实现一些复杂的操作。

class Test: def write(self,string): #do something you wanna do test = Test() temp = sys.stdout sys.stdout = test print 'hello world' 

前面我们是通过给手动给sys.stdout赋值改变print的输出位置,实际上print操作还有更简单的实现重定向的方式,再python2.7下,我们可以通过下面这种形式:

log = open('log.txt','a') print >> log,'hello world' #重定向到文件log.txt中 print 'hello world' #输出到默认位置 

这样一来就方便多了,当然类似的方法也可以应用到sys.stdin上,raw_input()就是调用了sys.stdin.read()方法,所以通过本文的阐述,我想大家应该清楚可以怎么做了。


![这里写图片描述](https://img-blog.csdn.net/?watermark/2/text/aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2hlX2FuZA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70) 关注我,了解更多精彩内容

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/207987.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 下午12:38
下一篇 2026年3月19日 下午12:38


相关推荐

  • VUE集成Office插件NTKO

    VUE集成Office插件NTKO使用 NTKO 插件 这玩意能不用就别用 因为它是插件 局限性比较大 在无法预知的用户环境上 各种问题 但是在安全上做的比较好 不会在用户本地缓存临时文件等 都是在内存中操作 然后流传输 over 浏览器判断 computed browser constuserAge navigator userAgent constrMsie msie s trident rv w constrFir

    2026年3月17日
    1
  • INTEGER PRIMARY KEY AUTOINCREMENT 和 INTEGER PRIMARY KEY 区别

    INTEGER PRIMARY KEY AUTOINCREMENT 和 INTEGER PRIMARY KEY 区别转自网络 地址不可考 谢谢原作者 如有冒犯 立即删除 Sqlite 中 INTEGERPRIMA 和 rowid INTEGERPRIMA 的使用 nbsp 在用 sqlite 设计表时 每个表都有一个自己的整形 id 值作为主键 插入后能直接得到该主键 nbsp 因为 sqlite 内部本来就会为每个表加上一个 rowid 这个 rowid 可以当成一个隐含的字段使用 nbsp 但

    2025年9月2日
    7
  • 深度解析:Dify能否复刻Deep Research与Manus?三大工具深度对比

    深度解析:Dify能否复刻Deep Research与Manus?三大工具深度对比

    2026年3月15日
    2
  • 在eclipse中没有server(需在选项中设置)

    Eclipse中没有Server选项,需要加载插件。步骤如下:①在软件eclipse下的Help->InstallNewSoftware->中,在Workwith中点击Add,如下,加入Name:KeplerLocation:http://download.eclipse.org/releases/kepler②找到选项Web,XML,JavaEEan…

    2022年4月10日
    211
  • Python获取Websocket接口的数据

    Python获取Websocket接口的数据作者:小小明在前面的用Tornado实现web聊天室一文中介绍了python实现websocket的方法,这篇文章将要分享如何用python作为客户端获取websocket接口的数据。前文链接:https://blog.csdn.net/as604049322/article/details/112386560websocket的使用WebSocket是一种在单个TCP/TSL连接上,进行全双工、双向通信的协议。WebSocket可以让客户端与服务器之间的数据交换变得更加简单高效,服务端.

    2022年7月15日
    29
  • 第二代微服务

    第二代微服务

    2021年7月12日
    90

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号