Saltar al contenido

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

Solución:

Puede usar pandas (la biblioteca que se convierte en predeterminada para trabajar con marcos de datos (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 tienes que usar skipinitialspace=True para tratar los espacios después del delimitador de coma.

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

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 quieres usar np.genfromtxt, tenga en cuenta que puede tomar iteradores en lugar de archivos, por ejemplo np.genfromtxt(my_iterator, ...). Entonces, puedes 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 tabulaciones.

Si está utilizando un numpy, probablemente desee trabajar con numpy.ndarray. Esto le dará un numpy.ndarray:

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

Pandas manejará el caso “Lexington, KY” correctamente

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *