Помогите с внесением данных в таблицу в файл через Python
У меня есть код, который рассчитывает спектр мощности сигнала. Приложу ниже. Так вот, при записи рассчитанных данных в текстовый документ в нем съезжают столбцы после значений, больше 9999. Это происходит на строчке 61 в коде. Выглядит так:
Мне нужно, чтобы все значения записывались в ровный столбец, не сдвигая последующие значения, как выделено на картинке. Я пробовал сделать так, чтобы после результата, превышающего 9999 ставился один таб через циклы if, for, но ничего не получилось. Помогите, пожалуйста, подправить этот момент. Код:
import numpy as np
import pandas as pd
from numpy import fft
# Чтение данных ЭЭГ в DataFrame
sample_csv = pd.read_csv("data_head.txt", skiprows=[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,131367], sep = '\t')
def is_float(x):
try:
float(x)
except ValueError:
return False
return True
sample = sample_csv[sample_csv.applymap(lambda x: is_float(x))].dropna()
sample = sample.apply(lambda col:pd.to_numeric(col, errors='coerce'))
N_sample = len(sample) # количество строк в DataFrame
# Индексированный список каналов (столбцов) ЭЭГ, записанных в DataFrame
channels = sample_csv.columns.values
Ranges = ['Alfa', 'Beta']
# Counting the number of recorded EEG channels
N_ch = len(channels) # Подсчет количества зарегистрированных каналов ЭЭГ
# Частота дискретизации записанных сигналов
Fs = 250 # Hz
tstep = 1/Fs # интервал выборки
N = 250*2 # количество семплов, сейчас 6 сек, если 3 мин то -> (250*60*3)
t = np.linspace(0, (N-1)*tstep, N) # временные шаги
fstep = Fs/N # частотный интервал
f = np.linspace(0, (N-1)*fstep, N) # шаги частоты
# установить границы общепринятых частотных диапазонов ЭЭГ
# эти значения могут варьироваться в зависимости от задачи
Af1 = int(8.0/fstep) # lower bound of Alfa
Af2 = int(13.0/fstep) # upper bound of Alfa
Bt1 = int(13.0/fstep) # lower bound of Beta
Bt2 = int(18.0/fstep) # upper bound of Beta
# Функция расчета спектра (частоты и амплитуды) методом БПФ
# расчет суммарной мощности спектра и мощности диапазона
def FFT_EEG(y) :
X = np.fft.fft(y)
X_mag = np.abs(X)/N
f_plot = f[0:int(N/2+1)]
X_mag_plot = 2*X_mag[0:int(N/2+1)]
X_mag_plot[0] = X_mag_plot[0]/2 # постоянная составляющая не требует 2x
# графики
# приведенный ниже код позволяет увидеть динамику сигнала и соответствующий амплитудно-частотный спектр
# за выбранный интервал времени (эпоху) и назначение
# функция расчета мощности спектра
def power_spectrum(start, stop) :
power = sum(X_mag_plot[i]**2 for i in range(start, stop))
return round(power, 2) # значение округляется до двух знаков после запятой
# расчет общей мощности спектра (от 0,5 до 35 Гц)
# расчет мощности спектра в диапазонах
Alfa_power = power_spectrum(Af1,Af2)
Beta_power = power_spectrum(Bt1,Bt2)
# запись в файл расчетных показателей для заданной эпохи заданного лида
with open('Spect_EEG.txt', 'a') as file:
file.write(str(Alfa_power) + '\t'*2 + str(Beta_power) + '\t'*2) #та самая 61 строка
# Запись заголовков столбцов в файл
with open('Spect_EEG.txt', 'w') as file :
for m1 in range(N_ch-4) :
for m2 in range(0, 2) :
file.write(str(channels[m1]) + Ranges[m2] + '\t')
file.write('\n') # перевод строки для записи спектральной мощности по эпохам
# Перечисление каналов
j=1
N_2 = N*j
while N_2 < N_sample :
for i in range(N_ch-4) :
y = sample[channels[i]]
y = y[(N_2-N):N_2]
FFT_EEG(y)
j=j+1
N_2 = N*j-1
with open('Spect_EEG.txt', 'a') as file :
file.write('\n') # перевод строки для записи следующей эпохи
Текстовый документ, на основе которого происходит рассчет не знаю, как загрузить сюда). Заранее благодарю
Ответы (1 шт):
Используйте форматирование строк.Например:
import random
for i in range(10):
for j in range(3):
k = random.random()
k1 = round(k*k*10, 3)
k2 = int(k*15000)
k3 = round(k*5080, 1)
print('{:>15}{:>15}{:>15}'.format(k1, k2, k3))