簡體   English   中英

python類文件上下文管理器

[英]python class file context manager

我正在嘗試在一個類中打開一個文件,並以這種方式在退出時將其關閉。

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函數中_parse_data打開一個文件。 我想with if一起使用with但很難。 關於如何使try部分更具pythonic的任何建議。

_parse_data沒有理由嘗試打開文件。 調用者有責任使用帶文件名的PlanetaryImage.open或提供__init__的打開文件句柄。 _parse_data應該只做一件事:從其流參數解析數據。

class PlanetaryImage(object):
    @classmethod
    def open(cls, filename):
        with open(filename, 'rb') as fp:
            return cls(fp, filename)

    def __init__(self, stream, memory_layout='DISK'):
        self._parse_data(stream)

    def _parse_data(self, data_stream):
        try:        
            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()

現在,只有兩個使用該類的選項:

with open(filename, 'rb') as fp:
    x = PlanetaryImage(fp)
    ...

要么

x = PlanetaryImage(filename)
....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM