可以python"与"命令用于可选地写入文件

时间:2014-11-21 19:23:44

标签: python io with-statement

我有一个脚本,它根据当时的需要接收一组数据和几个不同输出的命令行选项。目前,即使没有任何内容写入文件,由于"使用",因此正在创建该文件。下面的简化代码说明了我的观点。如果使用-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"只有在文件包含文本时才会创建文件。

1 个答案:

答案 0 :(得分:2)

您不能将创建作为with块的一部分停止。执行with obj as A时,obj块必须存在才能with块可以执行任何操作。在open('a.output', 'w')可以对此事发表任何意见之前,电话with会创建该文件。

可以编写您自己的上下文管理器,它会在with块的末尾自动删除该文件,但这不会阻止它首先被创建,并且块内的代码必须以某种方式手动“发信号”到上下文管理器进行删除(例如,通过在其上设置一些属性)。

在循环中使用单个文件with块可能更简单。像这样:

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

其中files_to_create是您在进入循环之前填充的列表,通过查看您的选项并仅在给出适当的选项时将文件添加到列表中。但是,正如我在评论中指出的那样,我认为您尝试处理此循环的方式存在其他问题,因此很难确切地知道代码应该是什么样的。