从文件或标准输入读取

85 投票
9 回答
94358 浏览
提问于 2025-04-15 16:04

我写了一个命令行工具,使用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,关闭它是没什么问题的。

撰写回答