使用Python 3.5。x,没有比它更大的了。 https://stackoverflow.com/a/30254551/257924是正确的答案,但是它没有提供一个内置在Python中的解决方案,而是需要从头开始编写代码: 我需要一个值为“-”的字符串来表示stdin,或者它的值是我想要读取的文本文件的路径。我想使用with操作符来打开这两种类型的文件,而不使用条件逻辑来检查脚本中的“-”。我有一些工作,但它似乎应该是内置在Python核心,不需要我滚动我自己的上下文管理器,像这样:
from contextlib import contextmanager
@contextmanager
def read_text_file_or_stdin(path):
"""Return a file object from stdin if path is '-', else read from path as a text file."""
if path == '-':
with open(0) as f:
yield f
else:
with open(path, 'r') as f:
yield f
# path = '-' # Means read from stdin
path = '/tmp/paths' # Means read from a text file given by this value
with read_text_file_or_stdin(path) as g:
paths = [path for path in g.read().split('\n') if path]
print("paths", paths)
我打算通过类似-p -的方式将参数传递给脚本,以表示“从标准输入读取”,或者-p some_text_file表示“从some_text_file读取”。 这是否要求我执行上面的操作,还是Python 3.5中内置了什么?x已经提供了这个?这似乎是编写CLI实用程序的一种常见需求,它可能已经由Python核心或标准库中的某些东西处理过了。 我不希望从3.5版的Python标准库之外的库中安装任何模块/包。x,就是这个。 问题来源StackOverflow 地址:/questions/59381035/how-to-read-dash-as-standard-input-with-python-without-writing-extra-code
argparse模块提供了一个文件类型工厂,它知道-约定。
import argparse
p = argparse.ArgumentParser()
p.add_argument("-p", type=argparse.FileType("r"))
args = p.parse_args()
注意,arg游戏。p是一个打开的文件句柄,所以没有必要“再次”打开它。虽然你仍然可以用with语句:
with args.p:
for line in args.p:
...
这只能确保在with语句本身出现错误时关闭文件。此外,您可能不希望与它一起使用,因为这会关闭文件,即使您打算稍后再次使用它。 您可能应该使用atexit模块来确保在程序结束时关闭文件,因为在开始时它已经为您打开了。
import atexit
...
args = p.parse_args()
atexit.register(args.p.close)
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。