传递无打开()

时间:2015-05-17 15:37:08

标签: python

我在一大块逻辑上有一个上下文管理器,看起来像

with open(file_name1, 'rb') as file1:
  with open(file_name2, 'a+b') as file2:
    logic_here

不幸的是,file_name2可能是None的边缘情况。但是,我仍然希望执行logic_here。有没有一种优雅的方法来处理这个而不删除上下文管理器?看起来我可能需要使用try / catch并在文件上手动调用.close()

我不介意在理论上打开任何文件,我不关心发生的写入内容。我确实想避免创建太多我写的临时文件,我确实希望避免意外写入可能已存在于磁盘上的个人文件。

2 个答案:

答案 0 :(得分:4)

快速,苛刻的解决方案,因为这似乎是你正在寻找的东西:

if file_name2 is None:
    file_name2 = os.devnull

请参阅:https://docs.python.org/2/library/os.html#os.devnull

答案 1 :(得分:1)

您可以创建一个返回文件对象或StringIO对象的自定义函数:

from io import StringIO

def openFileOrString (name, mode):
    if name != None:
        return open(name, mode)
    else:
        return StringIO()

with openFileOrString(file_name2, 'a+b') as file2:
    pass

由于StringIO不是Python 2中的上下文管理器,因此需要在其周围添加一些样板文件以使其在那里工作。一种方法是创建一个StringIO包装器,它是一个上下文管理器;一种更简单的方法是提供一个新的上下文管理器,它只使用文件的上下文管理器:

from StringIO import StringIO
from contextlib import contextmanager

@contextmanager
def openFileOrString (name, mode):
    if name != None:
        with open(name, mode) as f:
            yield f
    else:
        yield StringIO()