Il mio programma deve leggere i file csv che possono avere 1,2 o 3 colonne e deve modificare il suo comportamento di conseguenza. C'è un modo semplice per controllare il numero di colonne senza "consumare" una riga prima dell'esecuzione dell'iteratore? Il codice seguente è la più elegante ho potuto gestire, ma preferirei per eseguire il controllo prima che il ciclo for inizia:Trova il numero di colonne nel file csv
import csv
f = 'testfile.csv'
d = '\t'
reader = csv.reader(f,delimiter=d)
for row in reader:
if reader.line_num == 1: fields = len(row)
if len(row) != fields:
raise CSVError("Number of fields should be %s: %s" % (fields,str(row)))
if fields == 1:
pass
elif fields == 2:
pass
elif fields == 3:
pass
else:
raise CSVError("Too many columns in input file.")
Edit: avrei incluso ulteriori informazioni sui miei dati. Se c'è un solo campo, deve contenere un nome in notazione scientifica. Se ci sono due campi, il primo deve contenere un nome e il secondo un codice di collegamento. Se ci sono tre campi, il campo aggiuntivo contiene un flag che specifica se il nome è attualmente valido. Pertanto, se una riga ha 1, 2 o 3 colonne, tutte devono avere lo stesso valore.
migliore utilizzo 'fields' invece di' rows' . –
@MarcodeWit grazie, dovrebbe essere ovviamente 'fields'! Ho anche concordato con il punto che non tutte le righe hanno necessariamente lo stesso numero di campi. In questo caso ho deciso che dovrebbe sollevare un'eccezione se viene rilevata una riga di questo tipo. – rudivonstaden