Если вы можете использовать argparse
(т.е. Python 2.7+), у него есть встроенная поддержка того, что вы хотите: прямо с argparse
doc
Фабрика FileType
создает объекты, которые можно передать в аргумент типа ArgumentParser.add_argument()
. Аргументы, которые имеют FileType
объекты в качестве своего типа, откроют аргументы командной строки […] FileType
объекты понимают псевдо-аргумент '-' и автоматически преобразуют его в sys.stdin для читаемых FileType
объектов и sys.stdout
для FileType
объекты для записи.
Так что мой совет - просто использовать
import sys
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('file', type=argparse.FileType('r'),
help="Specifies the input file")
parser.add_argument('output', type=argparse.FileType('w'),
help="Specifies the output file")
args = parser.parse_args(sys.argv[1:])
# Here you can use your files
text = args.file.read()
args.output.write(text)
# … and so on
Тогда вы можете сделать
> python spam.py file output
Для чтения из file
и вывода в output
или
> echo "Ni!" | python spam.py - output
для чтения "Ni!"
и вывода в output
или
> python spam.py file -
...
И это хорошо, поскольку использование -
для соответствующего потока - это соглашение, которое многие программы используют . Если вы хотите указать это, добавьте его в строки help
.
parser.add_argument('file', type=argparse.FileType('r'),
help="Specifies the input file, '-' for standard input")
Для справки, сообщение об использовании будет
> python spam.py -h
usage: [-h] file output
positional arguments:
file Specifies the input file, '-' for standard input
output Specifies the output file, '-' for standard output
optional arguments:
-h, --help show this help message and exit