code: def create_batch(self, job_id, data, file_type):
          
          if not job_id or not self.has_active_session():
              raise Exception("Can not create a batch without a valid job_id and an active session.")
  
          headers = self._get_create_batch_content_headers(file_type)
          headers['Content-Length'] = str(len(data))
  
          response = requests.post(self._get_create_batch_url(job_id),
                                   headers=headers,
                                   data=data)
          response.raise_for_status()
  
          root = ET.fromstring(response.text)
          batch_id = root.find('%sid' % self.API_NS).text
          return batch_id
docs: Creates a batch with either a string of data or a file containing data.
  
          If a file is provided, this will pull the contents of the file_target into memory when running.
          That shouldn't be a problem for any files that meet the Salesforce single batch upload
          size limit (10MB) and is done to ensure compressed files can be uploaded properly.
  
          :param job_id: job_id as returned by 'create_operation_job(...)'
          :param data:
  
          :return: Returns batch_id