numpy genfromtxt / pandas read_csv; ignorar comas entre comillas

Considere un archivo, a.dat , con contenidos:

 address 1, address 2, address 3, num1, num2, num3 address 1, address 2, address 3, 1.0, 2.0, 3 address 1, address 2, "address 3, address4", 1.0, 2.0, 3 

Estoy tratando de importar con numpy.genfromtxt . Sin embargo, la función ve una columna adicional en la fila 3. Recibo un error similar con pandas.read_csv :

 np.genfromtxt('a.dat',delimiter=',',dtype=None,skiprows=1) ValueError: Some errors were detected ! Line #3 (got 7 columns instead of 6) 

y

 pandas read_csv sort of works - but it gives me an unaligned data structure: pd.read_csv('a.dat') pandas.parser.CParserError: Error tokenizing data. C error: Expected 6 fields in line 3, saw 7 

Estoy tratando de encontrar un parámetro de entrada para compensar esto. No me importa si termino con un npyray o un dataframe de pandas.

¿Hay algún parámetro que pueda establecer dentro de genfromtxt y / o read_csv que me permita ignorar la coma dentro de las marcas de voz?

Observo que read_csv incluye un quotechar='"' , definido así:

quotechar : string (longitud 1) El carácter utilizado para denotar el inicio y el final de un elemento citado. Los elementos citados pueden incluir el delimitador y se ignorarán.

Esto me parece que read_csv debería funcionar para mi caso por defecto, pero no lo hace.

Puedo ver que podría preprocesar el archivo para eliminar las comas. Me gustaría evitar eso si es posible, pero agradecería sugerencias si esta es la única manera.

Sólo conseguí encontrar esto :

El parámetro clave que faltaba es skipinitialspace=True – esto “se ocupa de los espacios después del delimitador de coma”

 a=pd.read_csv('a.dat',quotechar='"',skipinitialspace=True) address 1 address 2 address 3 num1 num2 num3 0 address 1 address 2 address 3 1 2 3 1 address 1 address 2 address 3, address4 1 2 3 

Esto funciona 🙂

El módulo csv incorporado de Python puede tratar este tipo de datos.

 with open("a.dat") as f: reader = csv.reader(f, skipinitialspace=True) header = next(reader) dtype = numpy.dtype(zip(header, ['S20', 'S20', 'S20', 'f8', 'f8', 'f8'])) data = numpy.fromiter(itertools.imap(tuple, reader), dtype=dtype)