2013-06-17 15 views
6

Ho un piccolo problema quando sto cercando di importare i dati dai file CSV con la funzione loadtxt di numpy. Ecco un esempio del tipo di file di dati che ho.numpy loadtxt salta prima riga

chiamano 'datafile1.csv':

# Comment 1 
# Comment 2 
x,y,z 
1,2,3 
4,5,6 
7,8,9 
... 
... 
# End of File Comment 

Lo script che ho pensato che sarebbe lavorare per questa situazione si presenta come:

import numpy as np 
FH = np.loadtxt('datafile1.csv',comments='#',delimiter=',',skiprows=1) 

Ma, sto ottenendo un errore:

ValueError: could not convert string to float: x 

Questo mi dice che i "salti" del kwarg non salta l'intestazione, salta la prima riga di commenti. Potrei semplicemente assicurarmi che skiprows = 3, ma la complicazione è che ho un numero molto grande di file, che non hanno necessariamente lo stesso numero di righe commentate nella parte superiore del file. Come posso assicurarmi che quando uso loadtxt sto ottenendo solo i dati reali in una situazione come questa?

P.S. - Anch'io sono aperto alle soluzioni di crudeltà.

+0

Dovrei anche aggiungere che ho provato varie soluzioni in Python per analizzare ogni linea per un commento o un personaggio, ma presto realizzato nulla di questo tipo potrebbe funzionare perché loadtxt fallisce proprio all'inizio. – astromax

risposta

12

Skip riga di commento espressione utilizzando manualmente generatore:

import numpy as np 

with open('datafile1.csv') as f: 
    lines = (line for line in f if not line.startswith('#')) 
    FH = np.loadtxt(lines, delimiter=',', skiprows=1) 
-1

creare la propria funzione filtro personalizzato, come ad esempio:

def skipper(fname): 
    with open(fname) as fin: 
     no_comments = (line for line in fin if not line.lstrip().startswith('#')) 
     next(no_comments, None) # skip header 
     for row in no_comments: 
      yield row 

a = np.loadtxt(skipper('your_file'), delimiter=',')