Python中sys.stdin和fileinput读取标准输入

源自《Python Linux系统管理与自动化运维》第3章打造命令行工具。

1. 使用sys.stdin和fileinput读取标准输入

众所周知,Shell脚本具有一个其他脚本语言都没有的优点,那就是管道。管道可以衔接不同的Linux命令,通过管道,我们可以使用多个简单的命令来实现一个复杂的功能。管道如此强大,因此,我们希望在Python语言中使用管道来结合Python语言和Shell脚本的优势。

在Python标准库的sys库中,有三个文件描述符,分别是stdin、stdout和stderr,这三个文件描述符分别代表标准输入、标准输出和错误输出。我们不需要调用open函数打开这几个文件就可以直接使用。例如,我们有一个名为read_stdin.py的文件,该文件仅仅是从标准输入中读取内容,然后打印到命令行终端。文件内容如下:

from __future__ import print_function  
import sys  
 
for line in sys.stdin:  
    print(line, end="") 

接下来,我们就可以像Shell脚本一样,通过标准输入给该程序输入内容。如下所示:

cat /etc/passwd | python read_stdin.py  
python read_stdin.py < /etc/passwd  
python read_stdin.py - 

sys.stdin是一个普通文件对象,除了从标准输入读取内容以外,并没有特殊之处。我们也可以使用sys.stdin调用文件对象的方法。如调用read函数读取标准输入中的所有内容,调用readlines函数将标准输入的内容读取到一个列表中。如下所示:

from __future__ import print_function  
import sys  
 
def get_content():  
    return sys.stdin.readlines()  
 
print(get_content()) 

3.1.2 使用sys.stdin和fileinput读取标准输入
《Python Linux系统管理与自动化运维》第3章打造命令行工具,本章介绍了如何使用Python语言解析ini格式的配置文件以及如何使用Python语言解析命令行参数,紧接着,本章介绍了Python标准库中的logging库,在本章最后,我们介绍了如何使用开源项目打造功能更加强大的命令行工具。本节为大家介绍使用sys.stdin和fileinput读取标准输入。

作者:赖明星来源:机械工业出版社|2017-09-28 16:35 收藏 分享
3.1.2 使用sys.stdin和fileinput读取标准输入

众所周知,Shell脚本具有一个其他脚本语言都没有的优点,那就是管道。管道可以衔接不同的Linux命令,通过管道,我们可以使用多个简单的命令来实现一个复杂的功能。管道如此强大,因此,我们希望在Python语言中使用管道来结合Python语言和Shell脚本的优势。

在Python标准库的sys库中,有三个文件描述符,分别是stdin、stdout和stderr,这三个文件描述符分别代表标准输入、标准输出和错误输出。我们不需要调用open函数打开这几个文件就可以直接使用。例如,我们有一个名为read_stdin.py的文件,该文件仅仅是从标准输入中读取内容,然后打印到命令行终端。文件内容如下:
from future import print_function
import sys

for line in sys.stdin:
print(line, end="")
接下来,我们就可以像Shell脚本一样,通过标准输入给该程序输入内容。如下所示:
cat /etc/passwd | python read_stdin.py
python read_stdin.py < /etc/passwd
python read_stdin.py -
sys.stdin是一个普通文件对象,除了从标准输入读取内容以外,并没有特殊之处。我们也可以使用sys.stdin调用文件对象的方法。如调用read函数读取标准输入中的所有内容,调用readlines函数将标准输入的内容读取到一个列表中。如下所示:
from future import print_function
import sys

def get_content():
return sys.stdin.readlines()

print(get_content())
awk是Linux下一个广泛使用的工具,从笔者的使用角度来说,有了sys.stdin,几乎可以不用awk语言。一方面,我们可以将Python程序与Linux下的管道进行较好的结合;另一方面,Python语言具有比awk应用领域广泛、可读性好、功能强大、语法清晰等诸多优点。因此,我们完全可以在Linux下使用Python语言替代awk进行数据处理。

如果读者熟悉awk,可能知道awk对多文件处理也提供了支持。在Python中,我们还可以使用fileinput进行多文件处理。fileinput是Python语言的一个标准库,它提供了比sys.stdin更加通用的功能。使用fileinput,可以依次读取命令行参数中给出的多个文件。也就是说,fileinput会遍历sys.argv[1:]列表,并按行依次读取列表中的文件。如果该列表为空,则fileinput默认读取标准输入中的内容。

fileinput的使用非常简单,大部分情况下,我们直接调用fileinput模块的input方法按行读取内容即可。例如,下面是一个名为read_from _fileinput.py的文件。在这个文件中,我们先导入fileinput模块,然后在for循环中遍历文件内容。如下所示:

#!/usr/bin/python  
from __future__ import print_function  
import fileinput  
 
for line in fileinput.input():  
    print(line, end="") 

3.1.2 使用sys.stdin和fileinput读取标准输入
《Python Linux系统管理与自动化运维》第3章打造命令行工具,本章介绍了如何使用Python语言解析ini格式的配置文件以及如何使用Python语言解析命令行参数,紧接着,本章介绍了Python标准库中的logging库,在本章最后,我们介绍了如何使用开源项目打造功能更加强大的命令行工具。本节为大家介绍使用sys.stdin和fileinput读取标准输入。

作者:赖明星来源:机械工业出版社|2017-09-28 16:35 收藏 分享
3.1.2 使用sys.stdin和fileinput读取标准输入

众所周知,Shell脚本具有一个其他脚本语言都没有的优点,那就是管道。管道可以衔接不同的Linux命令,通过管道,我们可以使用多个简单的命令来实现一个复杂的功能。管道如此强大,因此,我们希望在Python语言中使用管道来结合Python语言和Shell脚本的优势。

在Python标准库的sys库中,有三个文件描述符,分别是stdin、stdout和stderr,这三个文件描述符分别代表标准输入、标准输出和错误输出。我们不需要调用open函数打开这几个文件就可以直接使用。例如,我们有一个名为read_stdin.py的文件,该文件仅仅是从标准输入中读取内容,然后打印到命令行终端。文件内容如下:
from future import print_function
import sys

for line in sys.stdin:
print(line, end="")
接下来,我们就可以像Shell脚本一样,通过标准输入给该程序输入内容。如下所示:
cat /etc/passwd | python read_stdin.py
python read_stdin.py < /etc/passwd
python read_stdin.py -
sys.stdin是一个普通文件对象,除了从标准输入读取内容以外,并没有特殊之处。我们也可以使用sys.stdin调用文件对象的方法。如调用read函数读取标准输入中的所有内容,调用readlines函数将标准输入的内容读取到一个列表中。如下所示:
from future import print_function
import sys

def get_content():
return sys.stdin.readlines()

print(get_content())
awk是Linux下一个广泛使用的工具,从笔者的使用角度来说,有了sys.stdin,几乎可以不用awk语言。一方面,我们可以将Python程序与Linux下的管道进行较好的结合;另一方面,Python语言具有比awk应用领域广泛、可读性好、功能强大、语法清晰等诸多优点。因此,我们完全可以在Linux下使用Python语言替代awk进行数据处理。

如果读者熟悉awk,可能知道awk对多文件处理也提供了支持。在Python中,我们还可以使用fileinput进行多文件处理。fileinput是Python语言的一个标准库,它提供了比sys.stdin更加通用的功能。使用fileinput,可以依次读取命令行参数中给出的多个文件。也就是说,fileinput会遍历sys.argv[1:]列表,并按行依次读取列表中的文件。如果该列表为空,则fileinput默认读取标准输入中的内容。

fileinput的使用非常简单,大部分情况下,我们直接调用fileinput模块的input方法按行读取内容即可。例如,下面是一个名为read_from _fileinput.py的文件。在这个文件中,我们先导入fileinput模块,然后在for循环中遍历文件内容。如下所示:
#!/usr/bin/python
from future import print_function
import fileinput

for line in fileinput.input():
print(line, end="")
fileinput读取内容比sys.stdin更加灵活。fileinput既可以从标准输入中读取数据,也可以从文件中读取数据。如下所示:

cat /etc/passwd | python read_from_fileinput.py  
python read_from_fileinput.py < /etc/passwd  
python read_from_fileinput.py /etc/passwd  
python read_from_fileinput.py /etc/passwd /etc/hosts 

因为fileinput可以读取多个文件的内容,所以,fileinput提供了一些方法让我们知道当前所读取的内容属于哪一个文件。fileinput中常用的方法有:

filename:当前正在读取的文件名;

fileno:文件的描述符;

filelineno:正在读取的行是当前文件的第几行;

isfirstline:正在读取的行是否当前文件的第一行;

isstdin fileinput:正在读取文件还是直接从标准输入读取内容。

这些方法的使用也非常简单,如下所示:

#!/usr/bin/python  
from __future__ import print_function  
import fileinput  
 
for line in fileinput.input():  
    meta = [fileinput.filename(), fileinput.fileno(), fileinput.filelineno(),  
            fileinput.isfirstline(), fileinput.isstdin()]  
    print(*meta, end="")  
    print(line, end="") 

猜你喜欢

转载自blog.csdn.net/qq_36653505/article/details/86598829