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:]))