如何读“-”(破折号)作为标准输入与Python不写额外的代码?-问答-阿里云开发者社区-阿里云

开发者社区> 问答> 正文

如何读“-”(破折号)作为标准输入与Python不写额外的代码?

kun坤 2019-12-28 14:01:48 226

使用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

Python
分享到
取消 提交回答
全部回答(1)
  • kun坤
    2019-12-28 14:01:57

    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)
    
    0 0
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

推荐文章
相似问题
推荐课程