Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如果未提供文件名,请回退到标准输出_Python_File_Stdout - Fatal编程技术网

Python 如果未提供文件名,请回退到标准输出

Python 如果未提供文件名,请回退到标准输出,python,file,stdout,Python,File,Stdout,我有一个脚本,它接受一个文件名作为参数,然后打开它并编写一些东西 我将与语句一起使用: with open(file_name, 'w') as out_file: ... out_file.write(...) 现在,如果没有提供文件名,我想写入sys.stdout怎么办 我是否需要将所有操作包装在一个函数中,并在之前设置一个条件 if file_name is None: do_everything(sys.stdout) else: with open(f

我有一个脚本,它接受一个文件名作为参数,然后打开它并编写一些东西

我将
语句一起使用:

with open(file_name, 'w') as out_file:
    ...
    out_file.write(...)
现在,如果没有提供
文件名
,我想写入sys.stdout怎么办

我是否需要将所有操作包装在一个函数中,并在之前设置一个条件

if file_name is None:
    do_everything(sys.stdout)
else:
    with open(file_name, 'w') as out_file:
        do_everything(out_file)

您可以编写自己的上下文管理器。如果没有其他人使用
和。。。as
construct可用于自动关闭文件。这意味着将它与
sys.stdout
一起使用,正如我猜您知道的那样,将使您的程序崩溃,因为它将试图关闭系统stdout

这意味着,如果name else sys.stdout as:不起作用,则类似于带有open(name,'w')的

这让我说,没有任何简单的好方法可以更好地编写代码片段。。。但是可能有更好的方法来思考如何构造这样的代码

需要澄清的要点是,当文件名存在时,何时需要打开(更重要的是,关闭)文件名的filehandler

就我个人而言,我会简单地用..删除
。。就像
一样,注意打开文件,更重要的是,关闭文件在别的地方。根据您的软件的工作方式,这方面的里程可能会有所不同

这意味着您可以简单地执行以下操作:

out_file = open(file_name, 'w') if file_name else sys.stdout
并在整个程序中使用out_文件

关闭时,请记住检查它是否为文件:)

你有没有想过简单地使用这个模块?这很容易让你添加不同的处理程序,打印到文件,打印到标准输出

from contextlib import contextmanager
@contextmanager
def file_or_stdout(file_name):
    if file_name is None:
        yield sys.stdout
    else:
        with open(file_name, 'w') as out_file:
            yield out_file
那你就可以了

with file_or_stdout(file_name) as wfile:
    do_stuff_writing_to(wfile)

如何处理命令行参数?如果使用
argparse
,则可以使用
add_参数的和参数来处理此问题。例如,请尝试以下操作:

import sys
import argparse

def main(argv=None):

    if argv is None:
        argv=sys.argv[1:]

    parser = argparse.ArgumentParser()

    parser.add_argument('infile', nargs='?',
        type=argparse.FileType('w'),
        default=sys.stdin)

    args = parser.parse_args(argv)

    print args.infile

    return 0

if __name__=="__main__":
    sys.exit(main(sys.argv[1:]))

如果文件名作为参数出现,则脚本argparse将自动打开和关闭此文件,
args.infle
将是此文件的句柄。否则,
args.infle
将只是
sys.stdin

谢谢你的提示,但我正在使用python向一个
csv
写东西module@neurino答案的其余部分仍然适用。实际上,即使使用日志记录也可以工作;-)也许这太过分了@neurino和wrt您对@paxdiablo answer的评论,请仔细阅读我所写的内容:您真的不能在
sys.stdout
上使用
,因为您不希望它被关闭!那会使你的python程序崩溃!。。。或者你确实可以用
重写你自己的
。但这值得吗?我知道,但我的变通方法在我看来更容易阅读,并负责文件处理。好吧,但我的变通方法不是更容易阅读和理解吗?无论如何,这是一个很好的观点,+1。这似乎有点像蟒蛇:)需要一些
导入
我猜是的,对不起。刚刚以我喜欢的方式添加了
import
语句。没有
作为
或来自
就可以自由使用它。很好,不知道
argparse。文件类型
+1它会像使用
那样关闭文件吗?另外,您可以避免所有这些sys.argc[1:]…:)是的,你可以
sys.argv[1://code>仅用于从参数列表中删除脚本名称,这通常是您要执行的操作。
args=parser.parse_args()
通常是我需要执行的全部操作,;)你说得对:
parse_args
默认情况下从
sys.argv
获取参数字符串。我发现了一些关于我上面使用的模式的讨论,但现在不记得为什么会这样做了!无论如何,也许这一切都是多余的。
import sys
import argparse

def main(argv=None):

    if argv is None:
        argv=sys.argv[1:]

    parser = argparse.ArgumentParser()

    parser.add_argument('infile', nargs='?',
        type=argparse.FileType('w'),
        default=sys.stdin)

    args = parser.parse_args(argv)

    print args.infile

    return 0

if __name__=="__main__":
    sys.exit(main(sys.argv[1:]))