class gzip_open_func(object): """gzip open func modes: (r) read using gzip.GzipFile (w) write using system gzip (P) PIPE from `gzip -d` for """ def __init__(self, filename, mode='r', path_to_gzip='gzip'): self._filename = filename self._mode = mode self._path_to_gzip = path_to_gzip self._pickle_safe_init() def _pickle_safe_init(self): filename = self._filename if self._mode[0] == 'w': args = [self._path_to_gzip, '-f', '-c', '-'] stdout = open(filename, 'wb') self._stdout = stdout self.proc = Popen(args, stdin=PIPE, bufsize=0, stderr=stderr, stdout=stdout) self.write = self.proc.stdin.write self.close = self._close_w self.filename = filename elif self._mode[0] == 'r': self._file = GzipFile(filename, 'rb') self.read = self._file.read self.readline = self._file.readline self.close = self._file.close else: raise NotImplementedError def __getnewargs__(self): return (self._mode, self._filename) def __getstate__(self): result = {} result['_mode'] = self._mode result['_filename'] = self._filename result['_path_to_gzip'] = self._path_to_gzip return result def __iter__(self): if not self._mode == 'r': raise IOError('cannot iterate over file in write mode') return self._file.__iter__() def _close_w(self): """returns returncode """ self.proc.stdin.flush() self._stdout.flush() # self.proc.stdout.flush() self._stdout.close() # self.proc.communicate('\x1a') return