Al procesar datos CSV, ¿cómo ignoro la primera línea de datos?

Le estoy pidiendo a Python que imprima el número mínimo de una columna de datos CSV, pero la fila superior es el número de la columna, y no quiero que Python tome en cuenta la fila superior. ¿Cómo puedo asegurarme de que Python ignora la primera línea?

Este es el código hasta ahora:

import csv with open('all16.csv', 'rb') as inf: incsv = csv.reader(inf) column = 1 datatype = float data = (datatype(column) for row in incsv) least_value = min(data) print least_value 

¿Podría también explicar lo que está haciendo, no solo dar el código? Soy muy nuevo en Python y me gustaría asegurarme de que lo entiendo todo.

Podría usar una instancia de la clase Sniffer del módulo csv para deducir el formato de un archivo CSV y detectar si hay una fila de encabezado junto con la función next() incorporada para saltar la primera fila solo cuando sea necesario:

 import csv with open('all16.csv', 'r', newline='') as file: has_header = csv.Sniffer().has_header(file.read(1024)) file.seek(0) # Rewind. reader = csv.reader(file) if has_header: next(reader) # Skip header row. column = 1 datatype = float data = (datatype(row[column]) for row in reader) least_value = min(data) print(least_value) 

Dado que el datatype y la column están codificados en su ejemplo, sería un poco más rápido procesar la row esta manera:

  data = (float(row[1]) for row in reader) 

Nota: el código anterior es para Python 3.x. Para Python 2.x use la siguiente línea para abrir el archivo en lugar de lo que se muestra:

 with open('all16.csv', 'rb') as file: 

Para omitir la primera línea simplemente llame:

 next(inf) 

Los archivos en Python son iteradores sobre líneas.

Normalmente usaría next(incsv) que avanza el iterador una fila, por lo que omite el encabezado. El otro (digamos que quieres saltar 30 filas) sería:

 from itertools import islice for row in islice(incsv, 30, None): # process 

En un caso de uso similar, tuve que saltarme las líneas molestas antes de la línea con mis nombres de columna reales. Esta solución funcionó muy bien. Lea primero el archivo, luego pase la lista a csv.DictReader .

 with open('all16.csv') as tmp: # Skip first line (if any) next(tmp, None) # {line_num: row} data = dict(enumerate(csv.DictReader(tmp))) 

Tomado del libro de cocina de Python ,
Un código de plantilla más conciso podría verse así:

 import csv with open('stocks.csv') as f: f_csv = csv.reader(f) headers = next(f_csv) for row in f_csv: # Process row ... 

use csv.DictReader en lugar de csv.Reader. Si se omite el parámetro fieldnames, los valores en la primera fila del archivo csv se usarán como nombres de campo. entonces podrá acceder a los valores de campo usando la fila [“1”] etc.

El nuevo paquete ‘pandas’ podría ser más relevante que ‘csv’. El siguiente código leerá un archivo CSV, interpretando de forma predeterminada la primera línea como el encabezado de la columna y encontrará el mínimo entre las columnas.

 import pandas as pd data = pd.read_csv('all16.csv') data.min() 

Bueno, mi mini biblioteca de envoltorios también haría el trabajo.

 >>> import pyexcel as pe >>> data = pe.load('all16.csv', name_columns_by_row=0) >>> min(data.column[1]) 

Mientras tanto, si sabe qué índice de columna de encabezado es uno, por ejemplo, “Columna 1”, puede hacer esto en su lugar:

 >>> min(data.column["Column 1"]) 

Para mí la forma más fácil de ir es usar el rango.

 import csv with open('files/filename.csv') as I: reader = csv.reader(I) fulllist = list(reader) # Starting with data skipping header for item in range(1, len(fulllist)): # Print each row using "item" as the index value print (fulllist[item]) 

La documentación para el módulo CSV de Python 3 proporciona este ejemplo:

 with open('example.csv', newline='') as csvfile: dialect = csv.Sniffer().sniff(csvfile.read(1024)) csvfile.seek(0) reader = csv.reader(csvfile, dialect) # ... process CSV file contents here ... 

El Sniffer intentará detectar automáticamente muchas cosas sobre el archivo CSV. has_header() llamar explícitamente a su método has_header() para determinar si el archivo tiene una línea de encabezado. Si lo hace, entonces omita la primera fila al iterar las filas CSV. Puedes hacerlo así:

 if sniffer.has_header(): for header_row in reader: break for data_row in reader: # do something with the row 

Usaría cola para deshacerme de la primera línea no deseada:

 tail -n +2 $INFIL | whatever_script.py 

solo agrega [1:]

siguiente ejemplo:

 data = pd.read_csv("/Users/xyz/Desktop/xyxData/xyz.csv", sep=',', header=None)**[1:]** 

eso me funciona en iPython

Python 3.X

Manijas UTF8 BOM + HEADER

Fue bastante frustrante que el módulo csv no pudiera obtener fácilmente el encabezado, también hay un error con la lista de materiales UTF-8 (primer char en el archivo). Esto funciona para mí usando solo el módulo csv :

 import csv def read_csv(self, csv_path, delimiter): with open(csv_path, newline='', encoding='utf-8') as f: # https://bugs.python.org/issue7185 # Remove UTF8 BOM. txt = f.read()[1:] # Remove header line. header = txt.splitlines()[:1] lines = txt.splitlines()[1:] # Convert to list. csv_rows = list(csv.reader(lines, delimiter=delimiter)) for row in csv_rows: value = row[INDEX_HERE] 

Porque esto está relacionado con algo que estaba haciendo, lo compartiré aquí.

¿Qué sucede si no estamos seguros de si hay un encabezado y tampoco tiene ganas de importar rastreadores y otras cosas?

Si su tarea es básica, como imprimir o anexar a una lista o matriz, puede usar una sentencia if:

 # Let's say there's 4 columns with open('file.csv') as csvfile: csvreader = csv.reader(csvfile) # read first line first_line = next(csvreader) # My headers were just text. You can use any suitable conditional here if len(first_line) == 4: array.append(first_line) # Now we'll just iterate over everything else as usual: for row in csvreader: array.append(row)