2012-09-06 21 views
19

Soy muy nuevo en Python. Quiero analizar un archivo csv tales que reconocerá valores citados - por ejemploPython Parse CSV Correctamente

1997,Ford,E350,"Super, luxurious truck"

debería dividirse como

('1997', 'Ford', 'E350', 'Super, luxurious truck')

y NO

('1997', 'Ford', 'E350', '"Super', ' luxurious truck"')

Lo anterior es lo que me pasa si utilizo algo como str.split(,).

¿Cómo puedo hacer esto? ¿También sería mejor almacenar estos valores en una matriz u otra estructura de datos? porque después de obtener estos valores de la csv que deseo poder elegir fácilmente, digamos cualquiera de las dos columnas y almacenarlo como otra matriz u otra estructura de datos.

+0

He editado la pregunta. Si utilizo solo el delimitador ',' no reconoce el ',' dentro de las comillas – cornerstone

+0

Tiene que definir la 'cita' –

Respuesta

14

La 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 las columnas como la clave.

+0

falta una comilla simple de inicio delante de col3name. – codingknob

18

debería utilizar el módulo de csv:

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

de salida:

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

gracias. Pero cuando intento leer el archivo, aparece el siguiente error: 'csv.Error: la línea contiene un byte NULO' mi archivo contiene probablemente un millón de líneas, como las siguientes: ' 1 ,, "Advertir, error desconocido", "car-8554.gif", "car.gif", "crs_04", "change rand str, cut pos, 35289, add size, 9242" ' – cornerstone

+0

@cornerstone: ¿cómo está creando este archivo? No va a obtener el byte NULO para mostrar aquí por medios normales, pero si está en el archivo va a ser un problema leerlo por casi cualquier medio si lo trata como texto. – geoffspear

+0

@Wooble fue creado al arrojar valores de datos SQL al archivo csv. Me imaginé que el valor nulo se debe al sucesivo ",," presente en las líneas ... He encontrado una solución para eso. 'con open (r'car.csv ') como csv_file: ... reader = csv.reader ((line.replace (' \ 0 ',' ') para la línea en csv_file), delimiter =', ', quotechar = '"') ... print (reader.next())' – cornerstone

5

Usted tiene que definir la comillas dobles como el quotechar whithin la declaración 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'] 
>>> 
1

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

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

Si intenta:

print(array[3]) 

obtendrá:

"Super, luxurious truck"