我在一大块逻辑上有一个上下文管理器,看起来像
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()
。
我不介意在理论上打开任何文件,我不关心发生的写入内容。我确实想避免创建太多我写的临时文件,我确实希望避免意外写入可能已存在于磁盘上的个人文件。
答案 0 :(得分:4)
快速,苛刻的解决方案,因为这似乎是你正在寻找的东西:
if file_name2 is None:
file_name2 = 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()