我有一个接受任意文件句柄的函数,可以加载所有数据,或者允许数据加载,如果对象支持随机访问。
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))
如何检查文件对象是否支持随机访问?
答案 0 :(得分:3)
您可以使用seekable
方法检查文件是否支持随机访问。
<强>可查找()强>
如果流支持随机访问,则返回
True
。如果False
,seek()
,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))