2015-04-05 79 views
4

我得到如何打开文件,然后使用Python的预先构建函数与他们。但是sys.stdin如何工作?sys.stdin读什么?

for something in sys.stdin: 
    some stuff here 

lines = sys.stdin.readlines() 

sys.stdin上述两种不同用法有什么区别?它从哪里读取信息?是通过键盘吗,还是我们还要提供一个文件?

+0

你对'input()'熟悉吗?无论input()从哪里接受输入,都是'sys.stdin'。这可能是一个终端,或者它可能来自一个文件,或者它可能来自另一个程序的输出,或者它可能是别的,这取决于你如何调用程序。 – user2357112 2015-04-05 05:23:42

回答

5

所以,你必须使用Python的“预先内置函数”,大概是这样的:

file_object = open('filename') 
for something in file_object: 
    some stuff here 

这样通过这恰好返回从下一行的文件对象上调用迭代读取文件文件。

你也可以使用:

file_object = open('filename') 
lines = file_object.readlines() 

读取从当前文件位置的行成一个列表。

现在,sys.stdin只是另一个文件对象,恰好在您的程序启动之前由Python打开。你对该文件对象的处理由你决定,但它与任何其他文件对象没有任何区别,只是你不需要open

for something in sys.stdin: 
    some stuff here 

将迭代通过标准输入,直到达到文件结束。如此:

lines = sys.stdin.readlines() 

你的第一个问题实际上是关于使用文件对象的不同方式。

二,它从哪里读取?它从文件描述符0(零)读取。在Windows上,它是文件句柄0(零)。文件描述符/句柄0默认连接到控制台或tty,因此它实际上是从键盘读取的。但是它可以使用语法类似这样的重定向,通常由壳(如bash或CMD.EXE):

myprog.py < input_file.txt 

能改变文件描述符零读取文件而不是键盘。在UNIX或Linux上,它使用底层调用dup2()。阅读您的shell文档以获取有关重定向的更多信息(如果您很勇敢的话,也许是man dup2)。

3

它从标准输入读取 - 它应该由键盘以流数据的形式提供。

不需要提供文件,但是您可以使用redirection将文件用作标准输入。

在Python中,readlines()方法读取整个流,然后在换行符分裂起来并创建每一行的列表。

lines = sys.stdin.readlines() 

上面创建了一个名为lines的列表,其中每个元素将是一行(由行尾字符确定)。

您可以在Python教程的input and output section上阅读更多信息。

如果您想提示用户进行输入,使用input()方法(在Python 2 ,使用raw_input()):

user_input = input('Please enter something: ') 
print('You entered: {}'.format(user_input)) 
+0

那么当我使用sys.stdin.readlines()而不是sys.stdin时,标准输入的读取方式是不同的?第二个输入是否到达每个单词?我仍然困惑。 – Vimzy 2015-04-05 05:25:46

2
for something in sys.stdin: 
    some stuff here 

如您所愿,因为sys.stdin上面的代码不起作用是一个文件句柄 - 它是stdin的文件句柄。它不会到达some stuff here线

lines = sys.stdin.readlines() 

当上述在交互式shell运行脚本,它将直到用户按下CTRL-d,其指示输入结束块的执行。

+0

那么,当我使用sys.stdin.readlines()而不是sys.stdin时,标准输入的读取方式会有所不同吗?第二个输入是否到达每个单词?我仍然困惑。 – Vimzy 2015-04-05 05:31:50