Другой подход, который обрабатывает как смешанные разделители, так и условия, заключается в передаче файла через функцию фильтра.
Определите генератор, который принимает файл или все, что повторяется в строках, и возвращает отфильтрованный набор строк:
def foo(f):
for line in f:
x,y = line.split(':')
if y.strip()=='true':
yield x
Использование текстового standin для файла:
In [55]: txt='''2,3: true
...: 3,5: false
...: 4,2: true
...: 2,3: true
...: 3,5: false
...: 4,2: true'''
Генератор возвращает строки как:
In [56]: list(foo(txt.splitlines()))
Out[56]: ['2,3', '4,2', '2,3', '4,2']
genfromtxt
легко превращает такой канал в массив:
In [57]: np.genfromtxt(foo(txt.splitlines()),delimiter=',', dtype=int)
Out[57]:
array([[2, 3],
[4, 2],
[2, 3],
[4, 2]])
genfromtxt
повторяет файл в Python, поэтому использование foo
не должно сильно изменять его скорость.
pandas
имеет хороший csv-ридер, но в более быстрой скомпилированной версии не так много наворотов, как в Python.
Или я мог бы полностью пропустить genfromtxt
:
def foo1(f):
for line in f:
x,y = line.split(':')
if y.strip()=='true':
yield x.split(',')
In [63]: np.array(list(foo1(txt.splitlines())), dtype=int)
Out[63]:
array([[2, 3],
[4, 2],
[2, 3],
[4, 2]])
Формат файла после выбора строк достаточно прост, чтобы np.array
мог его обработать и напрямую преобразовать строку в целое.