有很多人把Python当做shell脚本的替代,用来实现系统任务的自动化处理,比如操纵文件、配置系统等。

通过重定向、管道或输入文件来作为脚本的输入

问题

我们希望自己编写的脚本能够接受任意一种对用户来说最为方便的输入机制。这应该包括从命令中产生输出给脚本、把文件重定向到脚本,或者只是在命令行中传递一个或者一列文件名给脚本。

解决方案

Python内置的fileinput模块使得这一切变得非常简单。如果有一个类似下面这样的脚本:

#!/usr/bin/env python3import fileinputwith fileinput.input() as f_input: for line in f_input: print(line, end='')

那么已经可以让脚本按照上述所有的方式来接收输入了。如果将这个脚本保存为filein.py并使其成为可执行的,那么就能够完成下列所有的操作并得到期望的输出:

$ ls | ./filein.py # Prints a directory listing to stdout.$ ./filein.py /etc/passwd # Reads /etc/passwd to stdout.$ ./filein.py < /etc/passwd # Reads /etc/passwd to stdout.

讨论

函数fileinput.input()创建并返回一个FileInput类的实例。除了包含有一些方便实用的帮助函数外,该实例还可以当做上下文管理器来用。因此,把所有这些结合在一起,如果我们编写一个脚本期望它能立刻从多个文件中打印输出,我们可以在输出中包含文件名和行号信息,就像下面这样:

>>> import fileinput>>> with fileinput.input('/etc/passwd') as f:>>> for line in f:... print(f.filename(), f.lineno(), line, end='').../etc/passwd 1 ##/etc/passwd 2 # User Database/etc/passwd 3 #

把它当做上下文管理器来使用可确保文件不再使用时会被关闭,此外我们这里还利用了FileInput实例的帮助函数来获取一些额外的信息。




python用重定向存储 python重定向输入_python用重定向存储


《Python Cookbook(第3版)中文版》介绍了Python应用在各个领域中的一些使用技巧和方法,其主题涵盖了数据结构和算法,字符串和文本,数字、日期和时间,迭代器和生成器,文件和I/O,数据编码与处理,函数,类与对象,元编程,模块和包,网络和Web编程,并发,实用脚本和系统管理,测试、调试以及异常,C语言扩展等。

本书覆盖了Python应用中的很多常见问题,并提出了通用的解决方案。书中包含了大量实用的编程技巧和示例代码,并在Python 3.3环境下进行了测试,可以很方便地应用到实际项目中去。此外,《Python Cookbook(第3版)中文版》还详细讲解了解决方案是如何工作的,以及为什么能够工作。

《Python Cookbook(第3版)中文版》非常适合具有一定编程基础的Python程序员阅读参考。