描述

sys.stdin ---- 标准输入函数,类似于input()
sys.stdput----标准输出函数,类似于print()
sys.stderr----标准错误输出函数
实际上,input()和print()都是通过调用标准流实现,sys.stdin和sys.stdout实质上不过是两个interface接口,用于切换不同i/o

sys.stdin vs input()

  • sys.stdin.readline() 用于读取一行文本输入,直到按回车,注意,使用该函数时,回车符也被读入
>>> import sys
>>> l=sys.stdin.readline()
123
>>>print(l)
# 输出 '123\n'
>>> len(l)
# 输出 4
  • sys.stdin.readlines() 用于读取多行文本输入,按下 回车 后,无法退出输入,需要 按下 Ctrl+z 然后 再按 回车
>>>import sys
>>>> i=sys.stdin.readlines()
1
2
3
a
b
c
^Z
>>> print(i)
['1\n', '2\n', '3\n', 'a\n', 'b\n', 'c\n']
  • input() 用于读取一行文本输入,回车符结束输入,但是不会被包含在输入内
>>> input()
i love wjl
'i love wjl' #输出
  • 总结:
  • sys.stdin的两种输入都会包含回车,而input()不会
  • sys.std和input() 两种输入的返回对象都是字符型,可以通过int()、floadt() 等 进行强制类型转换
  • sys.sydin消去换行符:
  • 法一:sys.stdin.readline().strip(’/n’)
  • 法二:sys.stdin.readline()[:-1]

sys.stdout vs print()

  • print:python在调用print的过程中,实际上是引用了sys.stdout.write(obj+’/n’)
    即 print()结束时默认换行,若想实现不自动换行,可使用print(param,end=’ ')
  • sys.stdout.write() 方法把字符写入到标准输出中,也就是控制台。
    该方法默认不换行,若想实现换行,可使用sys.stdout.write(‘str/n’)
  • 区别:print()几乎可以打印所有类型的数据,但是sys.stdout.write()只接受字符型数据
    eg:
>>> a=1
>>> type(a)
<class 'int'>
>>> sys.stdout.write(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: write() argument must be str, not int
>>> print(a)
1
  • 重定向
    1、重定向流到文件或程序
    在Windows和类Unix平台下,可以利用shell语法 < filename 把标准输入流重定向到文件输入
    eg:

假设已有Input.txt这样一个文本文件,现查看其中内容(type 是Windows下命令行命令,功能是显示文件内容)

C:\Users\Administrator>type input.txt 
8
6

以下是一个示例脚本,命名为 test.py

def interact():
	print('Hello stream world')  #正常输出
	while True:
		try:
			reply=input('Enter a number >') #输入(读取)来自sys.stdin的数据(也就是标准输入流的数据)
		except EOFError: #当文件结束时,抛出异常,结束循环
			break
		else:
			num=int(reply)
			print("%d squared is %d" % (num,num**2))
	print('Bye')

if __name__=='__main__':
	interact()

接下来,在命令行里正常运行test.py:

C:\Users\Administrator>python test.py  # 路径因人而异
Hello stream world
Enter a number >8  #输入8
8 squared is 64
Enter a number >6 #输入6
6 squared is 36
Enter a number >^Z # ctrl +z 是Windows下的文件结束符
Bye

利用重定向的方式运行该文本:

C:\Users\Administrator>python test.py < input.txt
Hello stream world
Enter a number >8 squared is 64
Enter a number >6 squared is 36
Bye

利用重定向,无需交互式输入

同样,可以利用> filename 将输出重定向到文件

C:\Users\Administrator>python test.py > output.txt  #仍需交互式输入,当outpu.txtt不存在时会在当前工作目录(cwd)下自动创建
8
6
^Z

C:\Users\Administrator>type output.txt 
Hello stream world
Enter a number >8 squared is 64
Enter a number >6 squared is 36
Bye

也可以在一个命令中把输入输出重定向结合起来,如下所示

C:\Users\Administrator>python test.py < inpu.txt > output.txt
Hello stream world
Enter a number >8 squared is 64
Enter a number >6 squared is 36
Bye

2、利用pipe管道链接程序
在Windows和类Unix平台上,在两个命令之间使用shell字符“|”,可以将前一个程序的标准输出发送到后一个程序的标准输入
eg:假设已有两个py文件----writer.py & reader.py

C:\Users\Administrator>python writer.py | python reader.py
# 即可将writer.py的输出作为reader.py的输入,记住,要保证前者的输出和后者的输入个数相同
#更简洁的写法:
C:\Users\Administrator> writer.py | reader.py

3、重定向到python对象
法一:自己写一个脚本(名为teststream.py),构造两个接口

import sys

class Output:  #模拟输出
	def __init__(self):
		self.text='' #新建空字符串
	def write(self,string):
		self.text+=string
	def writelines(self,lines):
		for line in lines:self.write(line)
		
class Input:   #模拟输入
	def __init__(self,input=''): # 默认参数
		self.text=input
	def read(self,size=None):
		if size==None:
			res,self.text=self.text,''
		else:
			res,self.text=self.text[:size],self.text[size:]
		return res
	def readline(self):
		eoln=self.text.find('\n')
		if eoln==-1:
			res,self.text=self.text,''
		else:
			res,self.text=self.text[:eoln+1],self.text[eoln+1:]
		return res

def redirect(function,pargs,kargs,input): #用于重定向,function是将执行的函数,pargs和kargs是function的可能参数
	savestreams=sys.stdin,sys.stdout #用savestreams暂时保当前的流接口
	sys.stdin=Input(input) #创建实例,将输入流导到自定义的类实例
	sys.stdout=Output()  #创建实例,将输出流导到自定义的类实例
	try:
		result=function(*pargs,**kargs)  #运行该函数,允许函数带参数
		output=sys.stdout.text # 将输出流中的结果保存到output
	finally:
		sys.stdin,sys.stdout=savestreams #再把输出输入流重定向到原来的样子
	return (result,output)

应用举例:

#已有一个函数test(),内容如下:
def test():
	m=input()
	print('success:',m)

#测试:
>>>from teststream import redirect
>>>from test import test
>>>(result,output)=redircet(test,(),{},'5') # 输入的5 加不加换行都可以,即'5'和'5\n'效果一样
>>>output
'success: 5\n'
>>> print(output) #print会将换行符转义,输出后 会换行
success: 5
		#此行就是换行符的效果
>>>

法二:使用python提供的io模块
详见 这里

法三:利用print调用中的重定向(上个链接中有示例)

语法:
print(content,file=aflie)

说明:

  • 利用参数,显示的指定一个文件,所有的输出见那个发送到该文件中
  • 所指定的文件是一个对象,而非一个字符串名称
  • 该方法不需要保存和重置回原输出流
  • 该方法为一次性方法,下次调用print时,若不指定file参数,则仍将输出到标准流

4、利用os.popen重定向子程序流
os.popen----可以在脚本内执行一条shell命令,用于重定向输入流,类似于shell的重定向流到程序的 管道(pipe) 语法(popen即pipe open,意思为管道开放)
eg:
假设已有一个hello-in.py文件,内容如下:

inp=input()
open('hello-in.txt','w').write('hello'+inp+'\n')

利用os.popen重定向子程序流:

>>>import os
>>>pipe=os.popen('python sello-in.py','w') # 在主程序中重定向子程序输入流
>>>pipe.wirte('sue\n')
4
>>>pipe.close() # 可以cclose方法中获取退出状态码,none即没问题 
>>>open('hello=in.txt').read()
'hello sue\n'

5、subprocess模块重定向
主要方法:Popen、PIPE(p140)