Я работаю с данными массива, хранящимися в файле ASCII (аналогично этой теме ). Мой файл занимает не менее 2 миллионов строк (158 МБ) и разделен на несколько разделов с разными схемами. В моем модуле для чтения формата я хочу прочитать весь файл через lines = open('myfile.txt', 'r').readlines()
, чтобы я мог индексировать позиции каждого раздела, а затем читать каждый нужный мне раздел в структурах данных NumPy.
Например, одна выдержка из раздела:
>>> print lines[5:10]
[' 1 0.1000 0.300E-03 0.000E+00 0.300E-03 0.000E+00 0.000E+00 0.300E-03 0.100E-03\n',
' 2 0.1000 0.120E-02 0.000E+00 0.120E-02 0.000E+00 0.000E+00 0.120E-02 0.100E-03\n',
' 3 0.1000 0.100E-02 0.000E+00 0.100E-02 0.000E+00 0.000E+00 0.100E-02 0.100E-03\n',
' 4 0.1000 0.110E-02 0.000E+00 0.110E-02 0.000E+00 0.000E+00 0.110E-02 0.100E-03\n',
' 5 0.1000 0.700E-03 0.000E+00 0.700E-03 0.000E+00 0.000E+00 0.700E-03 0.100E-03\n']
Имеет схему [int, float, float, float, float, float, float, float, float]
, а более поздняя часть будет иметь более простую схему [int, float]
:
>>> print lines[20:25]
[' 1 0.00000E+00\n',
' 2 0.43927E-07\n',
' 3 0.44006E-07\n',
' 4 0.44020E-07\n',
' 5 0.44039E-07\n']
Как быстро загрузить NumPy в разные участки линий? Я вижу, что есть np.loadtxt
, но он требует дескриптор файла и читает до конца. Я также вижу np.from*
функции, но я не уверен, как использовать их с уже прочитанным lines
. Нужно ли читать файл дважды?
Что касается разнородных типов данных, я полагаю, что могу использовать соединение dtype
, например np.dtype([('col1', '<i2'), ('col2', 'f4'), ('col3', 'f4'), ('col4', 'f4'), ('col5', 'f4'), ('col6', 'f4'), ('col7', 'f4'), ('col8', 'f4'), ('col9', 'f4')])
, правильно?