--- a
+++ b/exseek/scripts/ioutils.py
@@ -0,0 +1,85 @@
+import os
+import sys
+
+def make_dir(path):
+    if not os.path.exists(path):
+        try:
+            os.makedirs(path)
+        except OSError as e:
+            if e.errno == 17:
+                pass
+            else:
+                raise e
+
+def prepare_output_file(path):
+    if path.startswith('/dev'):
+        return
+    dirpath = os.path.dirname(path)
+    if dirpath == '':
+        dirpath = '.'
+    if not os.path.exists(dirpath):
+        os.makedirs(dirpath)
+
+def append_extra_line(f):
+    """Yield an empty line after the last line in the file
+    """
+    for line in f:
+        yield line
+    yield ''
+
+def open_file_or_stdout(filename):
+    if filename == '-':
+        return sys.stdout
+    else:
+        return open(filename, 'w')
+
+def open_file_or_stdin(filename):
+    if filename == '-':
+        return sys.stdin
+    else:
+        return open(filename, 'r')
+
+import zipfile
+class ArchiveFile(object):
+    def __init__(self, filename, mode='r', format='directory', **kwargs):
+        self.filename = filename
+        self.format = format
+        if self.format == 'directory':
+            if 'r' in mode:
+                if not os.path.isdir(filename):
+                    raise IOError('cannot open the directory: {}'.format(filename))
+            else:
+                os.makedirs(filename, exist_ok=True)
+        elif self.format == 'file':
+            self.f = open(file, mode)
+        elif self.format == 'zip':
+            if ('w' in mode) and ('compression' not in kwargs):
+                kwargs['compression'] = zipfile.ZIP_STORED
+            self.f = zipfile.ZipFile(filename, mode, **kwargs)
+
+    def open(self, name, mode='r', **kwargs):
+        if self.format == 'directory':
+            return open(os.path.join(self.filename, name), mode)
+        elif self.format == 'file':
+            return self.f
+        elif self.format == 'zip':
+            if 'r' in mode:
+                return self.f.open(name, mode)
+            else:
+                return
+
+    def close(self):
+        if self.format == 'directory':
+            pass
+        elif self.format == 'file':
+            self.f.close()
+        elif self.format == 'zipfile':
+            self.f.close()
+
+    def namelist(self):
+        if self.format == 'directory':
+            return os.listdir(self.filename)
+        elif self.format == 'file':
+            return self.filename
+        elif self.format == 'zip':
+            return self.f.namelist()