code: def read_text(forfn, nrows=None, verbose=True):
      r
      tqdm_prog = tqdm if verbose else no_tqdm
      nrows = wc(forfn, nrows=nrows)  # not necessary when nrows==None
      lines = np.empty(dtype=object, shape=nrows)
      with ensure_open(forfn) as f:
          for i, line in enumerate(tqdm_prog(f, total=nrows)):
              if i >= len(lines):
                  break
              lines[i] = ensure_str(line).rstrip('\n').rstrip('\r')
          if all('\t' in line for line in lines):
              num_tabs = [sum([1 for c in line if c == '\t']) for line in lines]
              del lines
              if all(i == num_tabs[0] for i in num_tabs):
                  f.seek(0)
                  return read_csv(f, sep='\t', header=None, nrows=nrows)
          elif sum((1 for line in lines if any((tag.lower() in line.lower() for tag in HTML_TAGS)))
                  ) / float(len(lines)) > .05:
              return np.array(html2text(EOL.join(lines)).split(EOL))
      return lines
docs: r""" Read all the lines (up to nrows) from a text file or txt.gz file
  
      >>> fn = os.path.join(DATA_PATH, 'mavis-batey-greetings.txt')
      >>> len(read_text(fn, nrows=3))
      3