Fastest way to do data type conversion using csv.DictReader in python

I'm working with a CSV file in python, which will have ~100,000 rows when in use. Each row has a set of dimensions (as strings) and a single metric (float).

As csv.DictReader or csv.reader return values as string only, I'm currently iterating over all rows and converting the one numeric value to a float.

for i in csvDict:
    i[col] = float(i[col])

Is there a better way that anyone could suggest to do this? I've been playing around with various combinations of map, izip, itertools and have searched extensively for some samples of doing it more efficiently, but unfortunately haven't had much success.

In case it helps: Я делаю это на appengine. Я полагаю , что то, что я делаю, может привести к следующей ошибке: Превышен предел размера мягкого процесса на 267,789 МБ после обслуживания 11 запросов - я получаю его только тогда, когда CSV довольно большой.

Изменить: Моя цель Я разбираю этот CSV-файл, чтобы использовать его в качестве источника данных для API визуализаций Google . Окончательный набор данных будет загружен в таблицу данных gviz для запроса. Тип необходимо указать при построении этой таблицы. Моя проблема также могла бы быть решена, если бы кто-нибудь знал о хорошем конвертере gviz csv-> datatable в python!

Edit2: My Code

Я считаю, что моя проблема связана с тем, как я пытаюсь исправитьCsvTypes (). Кроме того, data_table.LoadData () ожидает итеративный объект.

class GvizFromCsv(object):
  """Convert CSV to Gviz ready objects."""

  def __init__(self, csvFile, dateTimeFormat=None):
    self.fileObj = StringIO.StringIO(csvFile)
    self.csvDict = list(csv.DictReader(self.fileObj))
    self.dateTimeFormat = dateTimeFormat
    self.headers = {}
    self.ParseHeaders()
    self.fixCsvTypes()

  def IsNumber(self, st):
    try:
        float(st)
        return True
    except ValueError:
        return False

  def IsDate(self, st):
    try:
      datetime.datetime.strptime(st, self.dateTimeFormat)
    except ValueError:
      return False

  def ParseHeaders(self):
    """Attempts to figure out header types for gviz, based on first row"""
    for k, v in self.csvDict[0].items():
      if self.IsNumber(v):
        self.headers[k] = 'number'
      elif self.dateTimeFormat and self.IsDate(v):
        self.headers[k] = 'date'
      else:
        self.headers[k] = 'string'

  def fixCsvTypes(self):
    """Only fixes numbers."""
    update_to_numbers = []
    for k,v in self.headers.items():
      if v == 'number':
        update_to_numbers.append(k)
    for i in self.csvDict:
      for col in update_to_numbers:
        i[col] = float(i[col])

  def CreateDataTable(self):
    """creates a gviz data table"""
    data_table = gviz_api.DataTable(self.headers)
    data_table.LoadData(self.csvDict)
    return data_table

8
задан Martijn Pieters 27 July 2014 в 22:51
поделиться