【发布时间】:2023-07-16 08:38:01
【问题描述】:
我正在尝试以这种方式打开一个类中的文件并在退出时将其关闭。
class PlanetaryImage(object):
@classmethod
def open(cls, filename):
with open(filename, 'rb') as fp:
return cls(fp, filename)
def __init__(self, stream, filename=None, memory_layout='DISK'):
self.filename = filename
self._parse_data(stream)
def _parse_data(self, stream):
data_stream = stream
try:
if self.data_filename is not None:
dirpath = os.path.dirname(self.filename)
data_file = os.path.abspath(
os.path.join(dirpath, self.data_filename))
data_stream = open(data_file, 'rb')
data_stream.seek(self.start_byte)
if self.format in self.BAND_STORAGE_TYPE:
return getattr(self, self.BAND_STORAGE_TYPE[self.format])(data_stream)
raise Exception('Unkown format (%s)' % self.format)
finally:
data_stream.close()
在某些情况下,我必须在_parse_data 函数中再打开一个文件。我想使用with,但if 语句使它变得困难。有关如何使 try 部分更 Pythonic 的任何建议。
【问题讨论】:
-
您不能跨代码块使用
with。fp在PlanetaryImage.open返回后立即关闭。如果您希望fp在较长时间内保持打开状态,则需要在适当的时候手动将其关闭。 -
我不知道确切的原因,但
fp似乎没有关闭。我可以通过其他方法访问流 -
你真的在任何地方使用
PlanetaryImage.open吗? -
我刚刚编辑了代码。我在 init 中调用所有需要流的函数本身可能是
with的上下文,然后恰好是__init__? -
我是这样用的
PlanetaryImage.open(filename)
标签: python with-statement