|
|
|
|
移动端

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

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

作者:赖明星来源:机械工业出版社|2017-09-28 16:35

年前最后一场技术盛宴 | 1月27日与京东、日志易技术大咖畅聊智能化运维发展趋势!


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

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

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

  1. from __future__ import print_function  
  2. import sys  
  3.  
  4. for line in sys.stdin:  
  5.     print(line, end=""

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

  1. cat /etc/passwd | python read_stdin.py  
  2. python read_stdin.py < /etc/passwd  
  3. python read_stdin.py - 

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

  1. from __future__ import print_function  
  2. import sys  
  3.  
  4. def get_content():  
  5.     return sys.stdin.readlines()  
  6.  
  7. 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循环中遍历文件内容。如下所示:

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

fileinput读取内容比sys.stdin更加灵活。fileinput既可以从标准输入中读取数据,也可以从文件中读取数据。如下所示:

  1. cat /etc/passwd | python read_from_fileinput.py  
  2. python read_from_fileinput.py < /etc/passwd  
  3. python read_from_fileinput.py /etc/passwd  
  4. python read_from_fileinput.py /etc/passwd /etc/hosts 

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

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

fileno:文件的描述符;

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

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

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

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

  1. #!/usr/bin/python  
  2. from __future__ import print_function  
  3. import fileinput  
  4.  
  5. for line in fileinput.input():  
  6.     meta = [fileinput.filename(), fileinput.fileno(), fileinput.filelineno(),  
  7.             fileinput.isfirstline(), fileinput.isstdin()]  
  8.     print(*meta, end="")  
  9.     print(line, end=""

喜欢的朋友可以添加我们的微信账号:

51CTO读书频道二维码


51CTO读书频道活动讨论群:365934973

【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

程序员面试宝典

本书取材于各大IT公司历年面试真题(笔试、口试、电话面试、英语面试,以及逻辑测试和智商测试)。详细分析了应聘程序员(含网络、测试等...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊