docs: def load(cls, filename, **kwargs):
          """Load a Spectrum1D from a given filename.
          
          :param filename:
              The path of the filename to load. Can be either simple 1D FITS files
              or an ASCII filename.
  
          :type filename:
              str
          """
          
          if not os.path.exists(filename):
              raise IOError("filename {0} does not exist" .format(filename))
          
          if filename.lower().endswith(".fits") \
          or filename.lower().endswith(".fits.gz"):
              image = fits.open(filename, **kwargs)
              
              header = image[0].header
              
              # Check for a tabular data structure
              if len(image) > 1 and image[0].data is None:
  
                  names = [name.lower() for name in image[1].data.names]
                  dispersion_key = 'wave' if 'wave' in names else 'disp'
                  
                  disp, flux = image[1].data[dispersion_key], image[1].data['flux']
  
                  if 'error' in names or 'variance' in names:
                      variance_key = 'error' if 'error' in names else 'variance'
                      variance = image[1].data[variance_key]
  
              else:
  
                  # According to http://iraf.net/irafdocs/specwcs.php ....
                  #li = a.headers['LTM1_1'] * np.arange(a.headers['NAXIS1']) + a.headers['LTV1']
                  #a.headers['CRVAL1'] + a.headers['CD1_1'] * (li - a.headers['CRPIX1'])
  
                  if np.all([key in header.keys() for key in ('CDELT1', 'NAXIS1', 'CRVAL1')]):
                      disp = header['CRVAL1'] + (np.arange(header['NAXIS1']) \
                          - header.get("CRPIX1", 0)) * header['CDELT1']
              
                  if "LTV1" in header.keys():
                      disp -= header['LTV1'] * header['CDELT1']
  
                  #disp -= header['LTV1'] if header.has_key('LTV1') else 0
                  flux = image[0].data
  
                  # Check for an input_variance array
                  extnames = [ext.header.get("EXTNAME", None) for ext in image[1:]]
                  if "input_variance" in extnames:
                      index = 1 + extnames.index("input_variance")
                      variance = image[index].data
                      
                  else:
                      variance = None
              
                  # Check for logarithmic dispersion
                  if "CTYPE1" in header.keys() and header["CTYPE1"] == "AWAV-LOG":
                      disp = np.exp(disp)
  
              # Add the headers in
              headers = {}
              for row in header.items():
                  key, value = row
                  
                  # Check the value is valid
                  try:
                      str(value)
  
                  except TypeError:
                      logger.debug("Skipping header key {0}".format(key))
                      continue
  
                  if len(key) == 0 or len(str(value)) == 0: continue
      
                  if key in headers.keys():
                      if not isinstance(headers[key], list):
                          headers[key] = [headers[key]]
                      
                      headers[key].append(value)
  
                  else:
                      headers[key] = value
  
              for key, value in headers.iteritems():
                  if isinstance(value, list):
                      headers[key] = "\n".join(map(str, value))
  
          else:
              headers = {}
              try:
                  disp, flux, variance = np.loadtxt(filename, unpack=True, **kwargs)
              except:
                  disp, flux = np.loadtxt(filename, unpack=True, **kwargs)
              
          return cls(disp, flux, variance=variance, headers=headers)