write read example crear python parsing csv

read - Python Parse CSV correctamente



read csv python pandas (5)

Soy muy nuevo en Python. Quiero analizar un archivo csv para que reconozca los valores entre comillas, por ejemplo

1997, Ford, E350, "Super, camión de lujo"

debe ser dividido como

(''1997'', ''Ford'', ''E350'', ''Super, camión de lujo'')

y no

(''1997'', ''Ford'', ''E350'', ''"Super'', ''camión de lujo'' '')

lo anterior es lo que obtengo si uso algo como str.split(,) .

¿Cómo hago esto? ¿También sería mejor almacenar estos valores en una matriz o en alguna otra estructura de datos? porque después de obtener estos valores del csv quiero poder elegir fácilmente, digamos dos de las columnas y lo almacenamos como otra matriz o alguna otra estructura de datos.


Debe definir la comilla doble como la quotechar dentro de la csv.reader() :

>>> with open(r''<path_to_csv_test_file>'') as csv_file: ... reader = csv.reader(csv_file, delimiter='','', quotechar=''"'') ... print(reader.next()) ... [''1997'', ''Ford'', ''E350'', ''Super, luxurious truck''] >>>


Deberías usar el módulo csv :

import csv reader = csv.reader([''1997,Ford,E350,"Super, luxurious truck"''], skipinitialspace=True) for r in reader: print r

salida:

[''1997'', ''Ford'', ''E350'', ''Super, luxurious truck'']


El módulo csv.py probablemente esté bien, pero si desea ver y / o controlar cómo funciona, aquí hay una pequeña solución solo para python basada en una rutina:

def csv_parser(delimiter='',''): field = [] while True: char = (yield(''''.join(field))) field = [] leading_whitespace = [] while char and char == '' '': leading_whitespace.append(char) char = (yield) if char == ''"'' or char == "''": suround = char char = (yield) while True: if char == suround: char = (yield) if not char == suround: break field.append(char) char = (yield) while not char == delimiter: if char == None: (yield(''''.join(field))) char = (yield) else: field = leading_whitespace while not char == delimiter: if char == None: (yield(''''.join(field))) field.append(char) char = (yield) def parse_csv(csv_text): processor = csv_parser() processor.next() # start the processor coroutine split_result = [] for c in list(csv_text) + [None]: emit = processor.send(c) if emit: split_result.append(emit) return split_result print parse_csv(''1997,Ford,E350,"Super, luxurious truck"'')

Probado en Python 2.7


El siguiente método funcionó perfectamente

d = {} d[''column1name''] = [] d[''column2name''] = [] d[''column3name''] = [] dictReader = csv.DictReader(open(''filename.csv'', ''rb''), fieldnames = [''column1name'', ''column2name'', ''column3name''], delimiter = '','', quotechar = ''"'') for row in dictReader: for key in row: d[key].append(row[key])

Las columnas se almacenan en el diccionario con los nombres de columna como la clave.


Si no desea utilizar el módulo CSV, debe utilizar una expresión regular. Prueba esto:

import re array = re.split(",(?=(?:[^/"]*/"[^/"]*/")*[^/"]*$)", ''1997,Ford,E350,"Super, luxurious truck"'')

Si intentas:

print(array[3])

obtendrás:

"Super, luxurious truck"