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