2011-09-28 14 views
10

Quiero csv.DictReader para deducir los nombres de campo del archivo. The docs say "Si se omite el parámetro fieldnames, los valores en la primera fila del csvfile se usarán como nombres de campo.", pero en mi caso la primera fila contiene un título y la segunda fila que contiene los nombres.Cómo omitir líneas de encabezado previo con csv.DictReader?

No puedo aplicar next(reader) según Python 3.2 skip a line in csv.DictReader porque la asignación del nombre de campo tiene lugar al inicializar el lector (o lo estoy haciendo mal).

El csvfile (exportada desde Excel 2010, original source):

CanVec v1.1.0,,,,,,,,,^M 
Entity,Attributes combination,"Specification Code 
Point","Specification Code 
Line","Specification Code 
Area",Generic Code,Theme,"GML - Entity name 
Shape - File name 
Point","GML - Entity name 
Shape - File name 
Line","GML - Entity name 
Shape - File name 
Area"^M 
Amusement park,Amusement park,,,2260012,2260009,LX,,,LX_2260009_2^M 
Auto wrecker,Auto wrecker,,,2360012,2360009,IC,,,IC_2360009_2^M 

Mi código:

f = open(entities_table,'rb') 
try: 
    dialect = csv.Sniffer().sniff(f.read(1024)) 
    f.seek(0) 

    reader = csv.DictReader(f, dialect=dialect) 
    print 'I think the field names are:\n%s\n' % (reader.fieldnames) 

    i = 0 
    for row in reader: 
     if i < 20: 
      print row 
      i = i + 1 

finally: 
    f.close() 

resultados actuales:

I think the field names are: 
['CanVec v1.1.0', '', '', '', '', '', '', '', '', ''] 

resultado deseado:

I think the field names are: 
['Entity','Attributes combination','"Specification Code Point"',...snip] 

Me doy cuenta de que sería conveniente simplemente eliminar la primera fila y continuar, pero estoy tratando de acercarme lo más posible a la lectura de los datos in situ que pueda y minimizar la intervención manual.

Respuesta

1

Utilicé islice de itertools. Mi encabezado estaba en la última línea de un gran preámbulo. He pasado el preámbulo y hederline usado para los nombres de los campos:

with open(file, "r") as f: 
    '''Pass preamble''' 
    n = 0 
    for line in f.readlines(): 
     n += 1 
     if 'same_field_name' in line: # line with field names was found 
      h = line.split(',') 
      break 
    f.close() 
    f = islice(open(i, "r"), n, None) 

    reader = csv.DictReader(f, fieldnames = h) 
+0

Esta es una solución más flexible, siempre que se sepa con certeza un nombre de campo (una expectativa razonable). Gracias. –

12

Después f.seek(0), inserte:

next(f) 

para avanzar el puntero del archivo a la segunda línea antes de iniciar el DictReader.

+0

doh! por supuesto. Muchas gracias por su paciencia con un principiante. –

Cuestiones relacionadas