Skip to content

Instantly share code, notes, and snippets.

@alejandrobernardis
Created February 10, 2012 16:50
Show Gist options
  • Save alejandrobernardis/1790823 to your computer and use it in GitHub Desktop.
Save alejandrobernardis/1790823 to your computer and use it in GitHub Desktop.
CSV, MongoEngine
_Q = Q(...)&Q(...) # Query
_total = MyModel.objects(_Q).count()
if _total < 1:
error = MessageError(1, u"No se encontraron resultados con el filtro definido.")
else:
_skip = 0
_limit = 100
_range = int(_total/_limit)+1
_file_dir = os.path.abspath("")+"/my/path/csv"
_file_name = "file_name_%s.csv" % \
datetime.datetime.now().strftime("%Y%m%d_%H%M%S%f")
_file_path = "%s/%s" % (_file_dir, _file_name)
_file_header = ["header-1","header-2","header-3","header-4"]
def csv_write_row(row, _queue, _writer, _stream, _encoder,
_encoding="utf-8"):
_writer.writerow([s.encode(_encoding) for s in row])
data = _queue.getvalue()
data = data.decode(_encoding)
data = _encoder.encode(data)
_stream.write(data)
_queue.truncate(0)
with open(_file_path, "wb") as f:
_encoding = " iso-8859-1"
_queue = cStringIO.StringIO()
_writer = csv.writer(_queue, dialect=csv.excel, delimiter=',',
quotechar="'")
_stream = f
_encoder = codecs.getincrementalencoder(_encoding)()
csv_write_row(_file_header, _queue, _writer, _stream, _encoder)
for _ in range(_range):
_recordset = MyModel.objects(_Q).skip(_skip*_limit).limit(_limit)
for row in _recordset:
csv_write_row(row.to_csv(), _queue, _writer, _stream,
_encoder, _encoding)
_skip += 1
recordset = dict(total=_total, file=_file_name)
error = MessageError(0, u"El proceso finalizo correctamente.")
f.close()
print self.get_response(error.eid, error.message, recordset) # JSON Response
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment