code: def export_to_csv(
      table,
      filename_or_fobj=None,
      encoding="utf-8",
      dialect=unicodecsv.excel,
      batch_size=100,
      callback=None,
      *args,
      **kwargs
  ):
      
      # TODO: will work only if table.fields is OrderedDict
      # TODO: should use fobj? What about creating a method like json.dumps?
  
      return_data, should_close = False, None
      if filename_or_fobj is None:
          filename_or_fobj = BytesIO()
          return_data = should_close = True
  
      source = Source.from_file(
          filename_or_fobj,
          plugin_name="csv",
          mode="wb",
          encoding=encoding,
          should_close=should_close,
      )
  
      # TODO: may use `io.BufferedWriter` instead of `ipartition` so user can
      # choose the real size (in Bytes) when to flush to the file system, instead
      # number of rows
      writer = unicodecsv.writer(source.fobj, encoding=encoding, dialect=dialect)
  
      if callback is None:
          for batch in ipartition(serialize(table, *args, **kwargs), batch_size):
              writer.writerows(batch)
  
      else:
          serialized = serialize(table, *args, **kwargs)
          writer.writerow(next(serialized))  # First, write the header
          total = 0
          for batch in ipartition(serialized, batch_size):
              writer.writerows(batch)
              total += len(batch)
              callback(total)
  
      if return_data:
          source.fobj.seek(0)
          result = source.fobj.read()
      else:
          source.fobj.flush()
          result = source.fobj
  
      if source.should_close:
          source.fobj.close()
  
      return result
docs: Export a `rows.Table` to a CSV file.
  
  
      If a file-like object is provided it MUST be in binary mode, like in
      `open(filename, mode='wb')`.
      If not filename/fobj is provided, the function returns a string with CSV
      contents.