def open(self, filename=None, textmode=False, encoding='utf-8-sig'): if filename is None: filename = self._base_uri else: if self._file_type == 's3': filename = urljoin(self._base_uri.replace('s3://', 'http://'), filename.replace('\\', '/')).replace( 'http://', 's3://') elif self._file_type == 'http': filename = urljoin(self._base_uri, filename.replace('\\', '/')) else: filename = os.path.abspath( os.path.join( os.path.dirname(self._base_uri.replace('\\', '/')), filename.replace('\\', '/'))) f = None if self._file_type == 's3': uri_header, uri_body = filename.split('://', 1) us = uri_body.split('/') bucketname = us.pop(0) key = '/'.join(us) logger.info('Opening {}'.format(key)) if textmode: f = StringIO(self.read_s3_object(key).decode(encoding)) else: f = BytesIO(self.read_s3_object(key)) elif self._file_type == 'http': f = request.urlopen(filename) else: if textmode: f = open(filename, 'rt', encoding=encoding) else: f = open(filename, 'rb') f.ext = os.path.splitext(filename)[1].lower() yield f f.close()