2013-06-17 4 views
6

У меня небольшая проблема, когда я пытаюсь импортировать данные из CSV-файлов с функцией loadtxt numpy. Вот пример типа файлов данных, которые у меня есть.numpy loadtxt skip first row

Вызов его 'datafile1.csv':

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

Сценарий, который я думал, что будет работать в этой ситуации выглядит следующим образом:

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

Но я получаю сообщение об ошибке:

ValueError: could not convert string to float: x 

Это говорит мне, что «skiprows» kwarg не пропускает заголовок, он пропускает первую строку комментариев. Я мог бы просто убедиться, что skiprows = 3, но усложнение заключается в том, что у меня очень большое количество файлов, которые не все имеют одинаковое количество прокомментированных строк в верхней части файла. Как я могу убедиться, что когда я использую loadtxt, я получаю фактические данные только в такой ситуации?

P.S. - Я также открыт для решений bash.

+0

Я хотел бы также добавить, что я пробовал различные решения в Python для разбора каждая строка для комментария или символа, но быстро не понимала, что ничего подобного не может работать, потому что loadtxt не работает в самом начале. – astromax

ответ

12

Пропустить строка комментария выражение вручную с помощью генератора:

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

Создайте свою собственную пользовательскую функцию фильтра, например:

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=',')