A maneira mais rápida de fazer conversão de tipo de dados usando csv.DictReader em python
Estou trabalhando com um arquivo CSV em python, que terá ~ 100.000 linhas quando estiver em uso. Cada linha possui um conjunto de dimensões (como seqüências de caracteres) e uma única métrica (flutuante).
Como csv.DictReader ou csv.reader retornam valores apenas como string, atualmente estou iterando em todas as linhas e convertendo o valor numérico em um float.
for i in csvDict:
i[col] = float(i[col])
Existe uma maneira melhor que alguém possa sugerir para fazer isso? Venho brincando com várias combinações de mapa, izip, itertools e procurei extensivamente algumas amostras de fazê-lo com mais eficiência, mas infelizmente não obtivemos muito sucesso.
Caso isso ajude: estou fazendo isso no appengine. Euacreditam que o que estou fazendo pode resultar em que eu acerte esse erro: Excedeu o limite de tamanho de processo flexível com 267.789 MB após atender 11 pedidos no total - só o recebo quando o CSV é muito grande.
Editar: Meu Objetivo Estou analisando este CSV para que eu possa usá-lo como umfonte de dados para a API de visualizações do Google. O conjunto de dados final será carregado em uma DataTable gviz para consulta. O tipo deve ser especificado durante a construção desta tabela. Meu problema também poderia ser resolvido se alguém soubesse de um bom conversor gviz csv-> datatable em python!
Edit2: Meu Código
Acredito que meu problema esteja relacionado à maneira como tento fixCsvTypes (). Além disso, data_table.LoadData () espera um objeto iterável.
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