Vim*_*mzy 6 python stdin file sys
我学会了如何打开文件,然后使用Python的预先构建的函数.但是sys.stdin是如何工作的?
for something in sys.stdin:
some stuff here
lines = sys.stdin.readlines()
Run Code Online (Sandbox Code Playgroud)
sys.stdin上面两个不同用途之间有什么区别?从哪里读取信息?是通过键盘,还是我们还要提供文件?
cda*_*rke 11
所以你使用了Python的"预先构建的函数",大概是这样的:
file_object = open('filename')
for something in file_object:
some stuff here
Run Code Online (Sandbox Code Playgroud)
这通过调用文件对象上的迭代器来读取文件,该迭代器恰好返回文件中的下一行.
你可以改用:
file_object = open('filename')
lines = file_object.readlines()
Run Code Online (Sandbox Code Playgroud)
它将当前文件位置的行读入列表.
现在,sys.stdin它只是另一个文件对象,它恰好在程序启动之前由Python打开.你使用该文件对象做什么取决于你,但它与任何其他文件对象没有任何不同,只是你不需要open.
for something in sys.stdin:
some stuff here
Run Code Online (Sandbox Code Playgroud)
将遍历标准输入,直到达到文件结尾.这样:
lines = sys.stdin.readlines()
Run Code Online (Sandbox Code Playgroud)
您的第一个问题是关于使用文件对象的不同方式.
第二,从哪里读?它从文件描述符0(零)读取.在Windows上,它是文件句柄0(零).文件描述符/句柄0默认连接到控制台或tty,因此它实际上是从键盘读取.但是它可以通过shell(如bash或cmd.exe)重定向,使用如下语法:
myprog.py < input_file.txt
Run Code Online (Sandbox Code Playgroud)
这会将文件描述符零更改为读取文件而不是键盘.在UNIX或Linux上,它使用底层调用dup2().阅读您的shell文档以获取有关重定向的更多信息(或者man dup2如果您是勇敢的话).
它从标准输入中读取——它应该由键盘以流数据的形式提供。
不需要提供文件,但是您可以使用重定向将文件用作标准输入。
在 Python 中,该readlines()方法读取整个流,然后在换行符处将其拆分并创建每一行的列表。
lines = sys.stdin.readlines()
Run Code Online (Sandbox Code Playgroud)
上面创建了一个名为 lines 的列表,其中每个元素都是一行(由行尾字符确定)。
您可以在 Python 教程的输入和输出部分阅读有关此内容的更多信息。
如果要提示用户输入,请使用该input()方法(在 Python 2 中,使用raw_input()):
user_input = input('Please enter something: ')
print('You entered: {}'.format(user_input))
Run Code Online (Sandbox Code Playgroud)
要了解 sys.stdin 的工作原理,请执行以下操作:
创建一个简单的 python 脚本,我们将其命名为“readStdin.py”:
import sys
lines = sys.stdin.readlines()
print (lines)
Run Code Online (Sandbox Code Playgroud)
现在打开控制台任意类型:
echo "line1 line2 line3" | python readStdin.py
Run Code Online (Sandbox Code Playgroud)
该脚本输出:
['"line1 line2 line3" \n']
Run Code Online (Sandbox Code Playgroud)
因此,脚本已将输入读取到列表(名为“lines”)中,包括由“echo”生成的新行字符。那是。