read example python numpy pandas genfromtxt

python - read - genfromtxt example



Usando numpy.genfromtxt para leer un archivo csv con cadenas que contienen comas (4)

El problema con la coma adicional, np.genfromtxt no se ocupa de eso.

Una solución simple es leer el archivo con csv.reader() del módulo csv de python en una lista y luego volcarlo en una matriz numpy si lo desea.

Si realmente desea utilizar np.genfromtxt , tenga en cuenta que puede tomar iteradores en lugar de archivos, por ejemplo, np.genfromtxt(my_iterator, ...) . Entonces, puede envolver un csv.reader en un iterador y dárselo a np.genfromtxt .

Eso sería algo como esto:

import csv import numpy as np np.genfromtxt(("/t".join(i) for i in csv.reader(open(''myfile.csv''))), delimiter="/t")

Esto esencialmente reemplaza sobre la marcha solo las comas apropiadas con pestañas.

numpy.genfromtxt leer en un archivo csv con numpy.genfromtxt pero algunos de los campos son cadenas que contienen comas. Las cadenas están entre comillas, pero numpy no reconoce las comillas como la definición de una sola cadena. Por ejemplo, con los datos en ''t.csv'':

2012, "Louisville KY", 3.5 2011, "Lexington, KY", 4.0

el código

np.genfromtxt(''t.csv'', delimiter='','')

produce el error:

ValueError: ¡Se detectaron algunos errores! Línea # 2 (obtuvo 4 columnas en lugar de 3)

La estructura de datos que estoy buscando es:

array([[''2012'', ''Louisville KY'', ''3.5''], [''2011'', ''Lexington, KY'', ''4.0'']], dtype=''|S13'')

Al revisar la documentación, no veo ninguna opción para lidiar con esto. ¿Hay alguna forma de hacerlo con numpy, o simplemente necesito leer los datos con el módulo csv y luego convertirlo a una matriz numpy?


Puede usar pandas (la biblioteca por defecto para trabajar con dataframes (datos heterogéneos) en python científico) para esto. Es read_csv puede manejar esto. De los documentos:

quotechar: cadena

The character to used to denote the start and end of a quoted item. Quoted items can include the delimiter and it will be ignored.

El valor predeterminado es " . Un ejemplo:

In [1]: import pandas as pd In [2]: from StringIO import StringIO In [3]: s="""year, city, value ...: 2012, "Louisville KY", 3.5 ...: 2011, "Lexington, KY", 4.0""" In [4]: pd.read_csv(StringIO(s), quotechar=''"'', skipinitialspace=True) Out[4]: year city value 0 2012 Louisville KY 3.5 1 2011 Lexington, KY 4.0

El truco aquí es que también debe usar skipinitialspace=True para tratar los espacios después del delimitador de comas.

Además de un potente lector de csv, también puedo recomendar encarecidamente el uso de pandas con los datos heterogéneos que tiene (la salida de ejemplo en numpy que da son todas las cadenas, aunque podría usar matrices estructuradas).


Realice una mejor función que combine la potencia del módulo csv estándar y la recfromcsv de recfromcsv . Por ejemplo, el módulo csv tiene un buen control y personalización de dialectos, citas, caracteres de escape, etc., que puede agregar al ejemplo a continuación.

El ejemplo de la función genfromcsv_mod continuación se lee en un archivo CSV complicado similar al que ve Microsoft Excel, que puede contener comas dentro de los campos entre comillas. Internamente, la función tiene una función de generador que reescribe cada fila con delimitadores de pestañas.

import csv import numpy as np def recfromcsv_mod(fname, **kwargs): def rewrite_csv_as_tab(fname): with open(fname, ''rb'') as fp: reader = csv.reader(fp) for row in reader: yield ''/t''.join(row) return np.recfromcsv(rewrite_csv_as_tab(fname), delimiter=''/t'', **kwargs) # Use it to read a CSV file into a record array x = recfromcsv_mod(''t.csv'', case_sensitive=True)


Si está usando un numpy, probablemente quiera trabajar con numpy.ndarray. Esto te dará una numpy.ndarray:

import pandas data = pandas.read_csv(''file.csv'').as_matrix()

Pandas manejará el caso "Lexington, KY" correctamente