приведение к двумерному массиву
Получаю с оборудования строку в виде (разделитель табуляция):
#41391Id Vd
0 8E-05
0.0001 0.05192
0.0002 0.10384
0.0003 0.15568
0.0098
0.0099
0.01
Для последующей обработки надо строку привести в двумерный массив.
Для перевода в двумерный массив предполагаю конвертировать строку в List и через NumPy привести к требуемому виду.
# приводит к одномерному списку
items = [float(x) for x in list(text.split())]
Как дописать пропущенные значения в строку не понял.
По идее можно отследить сочетание табуляции и перевода каретки и заменить с добавлением нулей
Пробовал text.replace(r'\t\n\r', r'\t0.0\n\r') не меняет.
Первую строку удалить:
index_n = text.find('\n')
print(text[index_n:len(text)])
Ответы (2 шт):
Используйте Pandas и не мучайтесь с "ручным" разбором. Всё придумано до нас:
import pandas as pd
from io import StringIO
data = """
#41391Id Vd
0 8E-05
0.0001 0.05192
0.0002 0.10384
0.0003 0.15568
0.0098
0.0099
0.01
"""
with StringIO(data) as f:
df = pd.read_csv(f, sep='\s+')
df = df.fillna(0)
print(df)
Вывод:
#41391Id Vd
0 0.0000 0.00008
1 0.0001 0.05192
2 0.0002 0.10384
3 0.0003 0.15568
4 0.0098 0.00000
5 0.0099 0.00000
6 0.0100 0.00000
Если на выходе нужен массив Numpy, то просто берёте из датафрейма .values:
print(df.values)
Вывод:
[[0.0000e+00 8.0000e-05]
[1.0000e-04 5.1920e-02]
[2.0000e-04 1.0384e-01]
[3.0000e-04 1.5568e-01]
[9.8000e-03 0.0000e+00]
[9.9000e-03 0.0000e+00]
[1.0000e-02 0.0000e+00]]
Лучше не делать манипуляций с сырой строкой, а сначала разобрать ее, и уже делать манипуляции с массивами:
str = '' #ваша строка
lines = [x.split('\t') for x in str.split('\n')]
body = lines[1:] #отделяем заголовок
values = [([float(x[0]), 0.0] if len(x)==1 else [float(x[0]),float(x[1])]) for x in body]