Numpy loadtxt пропустить первую строку

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

Назовите его 'datafile1.csv':

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

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

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

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

ValueError: could not convert string to float: x

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

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

Ответ 1

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

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)

Ответ 2

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

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

Ответ 3

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

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

Это всего лишь небольшая модификация ответа @Jon Clements путем добавления необязательного параметра header, учитывая, что в некоторых случаях в файле csv есть строки комментариев (начинающиеся С#) без заголовка.