Ответ 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)
У меня небольшая проблема, когда я пытаюсь импортировать данные из 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.
Пропустить строку комментария вручную с помощью выражения генератора:
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)
Создайте собственную функцию фильтра, например:
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=',')
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 есть строки комментариев (начинающиеся С#) без заголовка.