CanPython“;加上;命令可用于选择性地写入文件

CanPython“;加上;命令可用于选择性地写入文件,python,io,with-statement,Python,Io,With Statement,我有一个脚本,它接收一组数据,并根据当时的需要,为几个不同的输出提供命令行选项。目前,即使没有任何内容写入文件,由于使用了“with”,也会创建该文件。下面的简化代码说明了我的观点。如果使用-a和-b选项调用该程序,则会完全按照我的要求生成3个输出正确的文件,但如果不需要a或b,则会创建“a.output”和“b.output”文件,其中不包含任何内容 import argparse parser = argparse.ArgumentParser(description="descripti

我有一个脚本,它接收一组数据,并根据当时的需要,为几个不同的输出提供命令行选项。目前,即使没有任何内容写入文件,由于使用了“with”,也会创建该文件。下面的简化代码说明了我的观点。如果使用-a和-b选项调用该程序,则会完全按照我的要求生成3个输出正确的文件,但如果不需要a或b,则会创建“a.output”和“b.output”文件,其中不包含任何内容

import argparse

parser = argparse.ArgumentParser(description="description")
parser.add_argument("-a", "--a", action='store_true', default = False, help = "A type analysis")
parser.add_argument("-b", "--b", action='store_true', default = False, help = "b type analysis")
args = parser.parse_args()

master_dictionary = {}
if args.a:
    master_dictionary["A"] = A_Function()
if args.b:
    master_dictionary["B"] = B_Function()
master_dictionary["default"] = default_Function()

with open("a.output", "w") as A, open("b.output", "w") as B, open("default.output", "w") as default:
    for entry in master_dictionary:
        print>>entry, printing_format_function(master_dictionary[entry])

我知道我可以折叠打印选项,以便在条件中执行函数调用,但在实际脚本中,情况更复杂,将打印放在分析块中也不太理想。我想要一个具体修改with命令的答案。目标是仅在“a.output”和“b.output”文件将包含文本时才创建它们。

您不能在
with
块中停止创建。当您将obj作为执行
操作时,
obj
必须先存在,然后
with
块才能对其执行任何操作。调用
open('a.output','w')
会在
with
拥有任何发言权之前创建文件

您可以编写自己的contextmanager,在
块末尾自动删除文件,但这不会阻止文件的创建,而且块内的代码必须手动向contextmanager发出“信号”以执行删除操作(例如,通过在其上设置某些属性)

如果在循环中有一个包含
块的文件
,可能会更简单。大概是这样的:

for output_file in files_to_create:
    with open(output_file, 'w') as f:
        # write to the file

其中,
files\u to\u create
是您在进入循环之前通过查看选项并仅在给出相应选项的情况下将文件添加到列表中来填充的列表。但是,正如我在评论中所指出的,我认为您试图处理此循环的方式还存在其他问题,因此很难确切知道代码应该是什么样子。

我认为您的循环不会像您认为的那样。对master_dictionary中的条目执行
操作将在字符串
“A”
“B”
上循环,而不是您创建的名为
A
B
的文件对象。感谢“with”解释,这与我的想法是一致的。我喜欢列出要创建的内容。如何在没有投票的情况下获得接受?但是,为什么人们会回答他们没有投票权的问题。。。