通过代码示例进行说明
我一直在问自己同样的问题,所以我想出了这两个 sn-ps,它们通过模仿后者与前者来阐明 sys.stdin 和 input() 的区别:
import sys
def my_input(prompt=''):
print(prompt, end='') # prompt with no newline
for line in sys.stdin:
if '\n' in line: # We want to read only the first line and stop there
break
return line.rstrip('\n')
这是一个更精简的版本:
import sys
def my_input(prompt=''):
print(prompt, end='')
return sys.stdin.readline().rstrip('\n')
这两个 sn-ps 与 input() 函数的不同之处在于它们不检测文件结尾(见下文)。
通过文档进行说明
官方文档是这样描述函数input()的:
输入([提示])
如果提示参数存在,则将其写入标准输出,不带尾随换行符。然后该函数从输入中读取一行,将其转换为字符串(去除尾随的换行符),然后返回。读取 EOF 时,会引发 EOFError。
下面是sys.stdin 的描述方式:
sys.标准输入
解释器用于标准输入的文件对象。
标准输入用于所有交互式输入(包括对 input() 的调用);
这些流(sys.stdin、sys.stdout 和 sys.stderr)是常规文本文件,类似于 open() 函数返回的文件。 [...]
所以input() 是一个函数,sys.stdin 是一个对象(一个文件对象)。
因此,它具有许多属性,您可以在解释器中探索这些属性:
> dir(sys.stdin)
['_CHUNK_SIZE',
'__class__',
'__del__',
'__delattr__',
'__dict__',
'__dir__',
...
'truncate',
'writable',
'write',
'write_through',
'writelines']
您可以单独显示,例如:
> sys.stdin.mode
r
它也有方法,例如readline(),它“从文件中读取一行;换行符(\n)留在字符串的末尾,只在最后一个被省略如果文件不以换行符结尾,则为文件的行。这使得返回值明确;如果 f.readline() 返回一个空字符串,则已到达文件末尾,而空行由 ' 表示\n',一个只包含一个换行符的字符串。" (1)
全面实施
最后一种方法让我们可以完全模拟 input() 函数,包括它的 EOF 异常错误:
def my_input(prompt=''):
print(prompt, end='')
line = sys.stdin.readline()
if line == '': # readline() returns an empty string only if EOF has been reached
raise EOFError('EOF when reading a line')
else:
return line.rstrip('\n')