code: def _load_txt(file, devices, channels, header, **kwargs):
      
  
      # %%%%%%%%%%%%%%%%%%%%%%%%%%% Exclusion of invalid keywords %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      kwargs_txt = _filter_keywords(numpy.loadtxt, kwargs)
  
      # %%%%%%%%%%%%%%%%%%%%%%%%%% Columns of the selected channels %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
      out_dict = {}
      for dev_nbr, device in enumerate(devices):
          out_dict[device] = {}
          columns = []
          for chn in channels[dev_nbr]:
              columns.append(header[device]["column labels"][chn])
              # header[device]["column labels"] contains the column of .txt file where the data of
              # channel "chn" is located.
              out_dict[device]["CH" + str(chn)] = numpy.loadtxt(fname=file, usecols=header[device]["column labels"][chn],
                                                                **kwargs_txt)
  
      return out_dict
docs: Function used for reading .txt files generated by OpenSignals.
  
      ----------
      Parameters
      ----------
      file : file, str, or pathlib.Path
          File, filename, or generator to read.  If the filename extension is
          ``.gz`` or ``.bz2``, the file is first decompressed. Note that
          generators should return byte strings for Python 3k.
  
      devices : list ["mac_address_1" <str>, "mac_address_2" <str>...]
          List of devices selected by the user.
  
      channels : list [[mac_address_1_channel_1 <int>, mac_address_1_channel_2 <int>...],
                      [mac_address_2_channel_1 <int>...]...]
          From which channels will the data be loaded.
  
      header : dict
          File header with relevant metadata for identifying which columns may be read.
  
      **kwargs : list of variable keyword arguments. The valid keywords are those used by
                 numpy.loadtxt function.
  
      Returns
      -------
      out_dict : dict
          Data read from the text file.