如何检查文件对象是否是随机访问

时间:2018-03-20 05:07:27

标签: python python-3.x random-access

我有一个接受任意文件句柄的函数,可以加载所有数据,或者允许数据加载,如果对象支持随机访问。

class DataLoader:
    def __init__(self, file):
        self.file = file
        self.headers = {}
    def load_data(self):
        # header is a hashable (e.g. namedtuple with name, size, offset)
        header = self.load_next_header()
        if self.file.random_access:
            # Return and load the data only as necessary if you can
            self.headers[header.name] = (header, None)
            self.file.seek(header.size + self.file.tell())
        else:
            # Load the data up front if you can't
            self.headers[header.name] = (header, self.file.read(header.size))

如何检查文件对象是否支持随机访问?

2 个答案:

答案 0 :(得分:3)

您可以使用seekable方法检查文件是否支持随机访问。

  

<强>可查找()

     

如果流支持随机访问,则返回True。如果Falseseek()tell()truncate()将提出OSError

答案 1 :(得分:1)

符合EAFP的Python约定的另一种方法是假设文件对象支持随机访问并处理不存在时发生的异常:

class DataLoader:
    def __init__(self, file):
        self.file = file
        self.headers = {}
    def load_data(self):
        # header is a hashable (e.g. namedtuple with name, size, offset)
        header = self.load_next_header()
        try:
            # Return and load the data only as necessary if you can
            self.headers[header.name] = (header, None)
            self.file.seek(header.size + self.file.tell())
        except OSError:
            # Load the data up front if you can't
            self.headers[header.name] = (header, self.file.read(header.size))