从文件或标准输入读取
我写了一个命令行工具,使用getopt来解析在命令行上输入的参数。我还想让文件名成为一个可选参数,就像其他工具(比如grep、cut等)那样。所以,我希望它能有以下用法:
tool -d character -f integer [filename]
我该如何实现以下功能呢?
- 如果提供了文件名,就从这个文件中读取数据。
- 如果没有提供文件名,就从标准输入(STDIN)读取数据。
9 个回答
22
我更喜欢用“-”来表示你应该从标准输入(stdin)读取数据,这样更清楚明了:
import sys
with open(sys.argv[1], 'r') if sys.argv[1] != "-" else sys.stdin as f:
pass # do something here
101
fileinput模块可能正好符合你的需求——假设你传入的非选项参数在args
里,那么:
import fileinput
for line in fileinput.input(args):
print line
如果args
是空的,那么fileinput.input()
会从标准输入(stdin)读取数据;如果args
里有内容,它就会依次从每个文件中读取数据,这个过程和Perl语言里的while(<>)
很像。
77
简单来说:
import sys
# parse command line
if file_name_given:
inf = open(file_name_given)
else:
inf = sys.stdin
在这个时候,你可以用 inf
来读取文件。根据你是否提供了文件名,这个操作会从指定的文件中读取内容,或者从标准输入(stdin)读取。
当你需要关闭文件时,可以这样做:
if inf is not sys.stdin:
inf.close()
不过,在大多数情况下,如果你用完了 sys.stdin
,关闭它是没什么问题的。