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 tenga en cuenta la fila superior. ¿Cómo puedo asegurarme de que Python ignore 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 entiendo todo.
1.0
para cada línea en su archivo y luego toma el mínimo, que será1.0
?1.0
. :)datatype(row[column]
... es lo que supongo que el OP está tratando de lograrRespuestas:
Puede usar una instancia de la clase
csv
del móduloSniffer
para deducir el formato de un archivo CSV y detectar si una fila de encabezado está presente junto con lanext()
función incorporada para omitir la primera fila solo cuando sea necesario:Dado que
datatype
ycolumn
están codificados en su ejemplo, sería un poco más rápido procesarrow
esto: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:
fuente
has_header(file.read(1024))
, ¿tiene sentido escribirhas_header(file.readline())
? Veo eso mucho, pero no entiendo cómohas_reader()
podría detectar si hay o no un encabezado de una sola línea del archivo CSV ...Sniffer
que no se describen las obras. FWIW nunca he visto quehas_header(file.readline())
se use e incluso si funcionara la mayor parte del tiempo, sospecharía mucho del enfoque por las razones expuestas.file.read(1024)
genera errores en la biblioteca csv de python :. Véase también aquí, por ejemplo.readline()
aread(1024)
. Hasta ahora solo he logrado encontrar personas que se hayan cambiado a readline para resolver el problema de csv.dialect.Para omitir la primera línea, simplemente llame:
Los archivos en Python son iteradores sobre líneas.
fuente
En un caso de uso similar, tuve que omitir líneas molestas antes de la línea con los nombres de mis columnas reales. Esta solución funcionó muy bien. Primero lea el archivo y luego pase la lista a
csv.DictReader
.fuente
data
diccionario, ni esta respuesta realmente agrega nada sobre la aceptada.data = dict()
y completarlo, pero es ineficiente y no idiomático. Además, uno debería usar dict literals ({}
) eenumerate
incluso entonces.@Veedrac
si quiere asegurarse de que me notifiquen, aunque Stack Overflow parece poder adivinar el nombre de usuario. (No escribo@Maarten
porque el respondedor será notificado de forma predeterminada.)Tomado de un libro de cocina de Python ,
un código de plantilla más conciso podría verse así:
fuente
Normalmente utilizaría
next(incsv)
que avanza el iterador una fila, por lo que se salta el encabezado. El otro (digamos que desea omitir 30 filas) sería:fuente
utilice csv.DictReader en lugar de csv.Reader. Si se omite el parámetro fieldnames, los valores de la primera fila del archivo csv se utilizarán como nombres de campo. entonces podrá acceder a los valores de campo usando la fila ["1"], etc.
fuente
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 columna y encontrando el mínimo entre columnas.
fuente
pd.read_csv('all16.csv').min()
Bueno, mi mini biblioteca de contenedores también haría el trabajo.
Mientras tanto, si sabe qué es el índice de la columna de encabezado uno, por ejemplo, "Columna 1", puede hacer esto en su lugar:
fuente
Para mí, la forma más fácil de hacerlo es usar range.
fuente
Debido a que esto está relacionado con algo que estaba haciendo, lo compartiré aquí.
¿Qué pasa si no estamos seguros de si hay un encabezado y tampoco quieres importar sniffer y otras cosas?
Si su tarea es básica, como imprimir o agregar a una lista o matriz, puede usar una declaración if:
fuente
La documentación del módulo CSV de Python 3 proporciona este ejemplo:
El
Sniffer
tratará de detectar automáticamente muchas cosas sobre el archivo CSV. Debe llamar explícitamente a suhas_header()
método para determinar si el archivo tiene una línea de encabezado. Si es así, omita la primera fila al iterar las filas CSV. Puedes hacerlo así:fuente
Usaría tail para deshacerme de la primera línea no deseada:
fuente
solo agrega [1:]
ejemplo a continuación:
eso me funciona en iPython
fuente
Python 3.X
Maneja UTF8 BOM + HEADER
Fue bastante frustrante que el
csv
módulo no pudiera obtener fácilmente el encabezado, también hay un error con UTF-8 BOM (primer carácter en el archivo). Esto funciona para mí usando solo elcsv
módulo:fuente
Convertiría csvreader a list, luego aparecería el primer elemento
fuente
Python 2.x
csvreader.next()
Python 3.x
csvreader.__next__()
fuente