2014-10-17 2 views
2

Есть ли способ использовать np.loadtxt и аргумент преобразователей для разделения столбца на два столбца?Используйте np.loadtxt для разделения столбца при чтении

Строки в моем текстовом файле выглядит следующим образом:

1 2 A=3;B=4 

, и я хочу, чтобы прочитать это как:

[1,2,3,4] 

Файл достаточно большой, чтобы чтение построчно будет слишком медленный.

Я попытался это:

parse_col = lambda x: [ float(x.split(';')[0].split('=')[1]), int(x.split(';')[1].split('=')[1]) ] 

np.loadtxt('demo.txt',usecols=[0,1,2],comments='#',converters={2:parse_col},dtype=int) 

Спасибо!

ответ

1

Вы можете создать генератор, который вызывает синтаксический анализатор и передать его np.genfromtxt:

import re 

import numpy as np 

def parser(s): 
    for i in re.findall('[a-zA-Z]+', s): 
     s = s.replace(i, '') 
    return s.replace('=', '').replace(';',' ') 

gen = (parser(line) for line in open('demo.txt')) 
np.genfromtxt(gen, comments='#', usecols=(0, 1, 2, 3)) 

Обратите внимание, что я использовал re.findall, чтобы определить и заменить более общую картину, как отметил @PadraicCunningham.

+1

Это будет работать только для A и B, которые могут быть не все, что есть в файле –

+0

@PadraicCunningham, вы правы ... Я обновил ответ, используя 're.findall()' с более общим шаблоном –

+0

@SaulloCastro Спасибо! Две проблемы - мне нужно игнорировать столбцы (я делаю это в своей функции парсера), а «demo.txt» - это заархивированный файл. Будет ли это работать? Я разделил s в «parser», чтобы выбрать столбцы, и я получаю indexerror – Stefan

Смежные вопросы