Ваш формат борется пара предположений, что genfromtxt
делает:
1) у вас есть и строка комментариев и строка заголовка (без символа #)
2) имена ваших колонок имеют пробелы, которые genfromtxt
настаивает на преобразовании в _
(или какой-либо другой допустимый символ).
Если я создаю текстовый файл с образцом, и заменить пробелы с закладками (который является боль, тем более, что мои редакторы настроены заменить вкладки с пробелами), это работает:
In [330]: np.genfromtxt('stack29451030.txt',delimiter='\t',dtype=None,skip_header=3,names=True)
Out[330]:
array([(2, 8, 14, 748, 748, 748, 790), (2, 9, 22, 262, 245, 252, 328)],
dtype=[('p', '<i4'), ('q', '<i4'), ('r', '<i4'), ('y_1', '<i4'), ('y_2', '<i4'), ('y_3', '<i4'), ('y_4', '<i4')])
я играл с replace_space=' '
. Похоже, что он использует только замены, которые создают допустимые имена переменных и атрибутов Python. Итак, 'y_1'
в порядке, но не 'y 1
'. Я не вижу способа использования параметров.
comments
и names
не сотрудничают в вашем случае. Он может пропускать строки комментариев, но затем будет читать строку имен в качестве данных.
In [350]: np.genfromtxt('stack29451030.txt',delimiter='\t',dtype=None,comments='#')
Out[350]:
array([['p', 'q', 'r', 'y 1', 'y 2', 'y 3', 'y 4'],
['2', '8', '14', '748', '748', '748', '790'],
['2', '9', '22', '262', '245', '252', '328']],
dtype='|S3')
Он может обрабатывать строку названия как #p q r y1 y2 y3 y4
, не обращая внимания на #, но тогда он не пропускает ранее комментарии линий. Поэтому, если вы можете удалить строки комментариев или строку заголовка, он сможет ее прочитать. Но похоже, что вы должны использовать что-то другое, кроме comments
.
Это выглядит как самая чистая нагрузка - явно пропускают 1-ю 3 строки, принимают строку заголовка, а затем используют идею jedwards's
для замены _
.
In [396]: A=np.genfromtxt('stack29451030.txt',delimiter='\t',dtype=None,skip_header=3,names=True)
In [397]: A.dtype.names = [n.replace('_', ' ') for n in A.dtype.names]
In [398]: A
Out[398]:
array([(2, 8, 14, 748, 748, 748, 790), (2, 9, 22, 262, 245, 252, 328)],
dtype=[('p', '<i4'), ('q', '<i4'), ('r', '<i4'), ('y 1', '<i4'), ('y 2', '<i4'), ('y 3', '<i4'), ('y 4', '<i4')])
Если вы не знаете, сколько комментариев строк есть, этот генератор может фильтровать их:
with open('stack29451030.txt') as f:
g = (line for line in f if not line.startswith('#'))
A = np.genfromtxt(g, delimiter='\t', names=True, dtype=None)
genfromtxt
принимает входные данные от любой итерации, будь то файл, список строк, или генератора, подобного этому.
Он работает, если вы публикуете комментарии в файле данных. У меня всегда есть комментарии в файле данных, и из-за этого я использовал comment = '#', но он не работает. –
Извините, я играл с файлом данных и удалял комментарии. Я обновил для правильного чтения. Это отлично работает на моей стороне. – chthonicdaemon