python中的print与sys.stdout
print与sys.stdout
在python中,print语句实现打印,从技术角度来说,这是把一个或多个对象转换为其文本表达式形式,然后发送给标准输出流或者类似的文件流,更详细的说,打印与文件和流的概念紧密相连。
我们都知道在python中,向一个文件写东西是通过类似file.write(str)方法实现的,而你可能没想到print语句执行的操作其实也是一个写操作,不过他把我们从外设输入的数据写到了stdout流,并进行了一些特定的格式化。当然,和文件方法不通,在执行打印操作是,不需要将对象转换为字符串(print已经帮我们做好了)。
print 123
等价于
import sys
sys.stdout.write(str()+'n')
这里的sys.stdout也就是我们python中标准输出流,这个标准输出流默认是映射到打开脚本的窗口的,所以,我们的print操作会把字符打印到屏幕上。既然sys.stdout默认是映射到打开脚本的窗口,那么这个映射关系是否可以修改呢?
答案是肯定的,这也是python中常用的一个小技巧,我们可以通过修改这种映射关系来把我们的打印操作重定向到其它地方,例如特定的文件。方法就是给sys.stdout赋值,修改它的指向。看下面的例子:
import sys
sys.stdout = open('test.txt','w')
print 'Hello world'
可以看到,我们让sys.stdout指向了一个文件对象。然后,再执行打印操作,这时,hello world输出在了一个文件test.txt中:
这里写图片描述
但是,上面的代码有一个问题,我们把打印重定向到了一个文件中,那么在程序后面每一处调用print操作的输出都在这个文件中,那么我们后面想要打印字符到屏幕怎么办?
所以,这就需要我们先保存原始的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()方法,所以通过本文的阐述,我想大家应该清楚可以怎么做了。
- 排查Java的内存问题
- 使用两种方法让 ASP.NET Core 实现遵循 HATEOAS 结构的 RESTful API
- 设计模式六大原则(5):迪米特法则
- Selenium2+python自动化61-Chrome浏览器(chromedriver)
- 区块链可以减少社会不平等吗?
- 【干货】不止准确率:为分类任务选择正确的机器学习度量指标(附代码实现)
- python爬虫beautifulsoup4系列1
- 区块链入门教程
- python爬虫beautifulsoup4系列2
- python爬虫beautifulsoup4系列3
- 多元回归模型
- C++ STL之min_element()与max_element()(取容器中的最大最小值)
- RESTful API 设计最佳实践
- python爬虫beautifulsoup4系列4-子节点
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法