Только импорт строк с определенным количеством столбцов из файла в Python
Я пытаюсь импортировать несколько файлов в свой код в цикле for для анализа, но не все файлы отформатированы одинаково (и их слишком много для ручного редактирования).
Мне нужны одинаковые данные в каждом файле - 13 столбцов, которые я импортирую как строки. Ниже приведен пример файла:
could not open XWindow display
could not open XWindow display
No graphics display available for this session.
Graphics tasks that attempt to plot to an interactive screen will fail.
/data/poohbah/2/asassn/be/F0041-70_2645
### JD HJD UT_date IMAGE FWHM Diff Limit mag mag_err counts counts_err flux(mJy) flux_err
2456784.50841 2456784.50816 2014-05-07.0072681 interp_bf002339_coadd 2.61 -2.65 17.031 15.543 0.093 526.82 44.57 2.328 0.197
2456789.45407 2456789.45347 2014-05-11.9529421 interp_be003585_coadd 2.26 -2.31 16.869 15.383 0.093 834.50 70.78 2.695 0.229
2456790.47441 2456790.47419 2014-05-12.9732922 interp_bf004070_coadd 1.72 -2.25 17.246 15.721 0.090 645.67 52.82 1.974 0.162
...
(data continues)
...
2457895.45745 2457895.45919 2017-05-21.9587133 interp_bf305499_coadd 1.71 -2.45 17.299 15.482 0.068 673.31 42.10 2.461 0.154
/data/poohbah/1/assassin/bin/./ap_phot_im_cal_test.py:654: RuntimeWarning: invalid value encountered in sqrt
counts_err_a = np.sqrt( counts_a / options.gain + (area_a * bg_stdev_a **2.0 ) )
/data/poohbah/1/assassin/bin/./ap_phot_im_cal_test.py:369: RuntimeWarning: invalid value encountered in less_equal
no_detected = np.nonzero( (counts <= limit) & (area >= 0.01) )[0]
/data/poohbah/1/assassin/bin/./ap_phot_im_cal_test.py:367: RuntimeWarning: divide by zero encountered in log10
maglimit[notbad] = -2.5 * np.log10(limit[notbad]) + def_zeropt
Мне нужны только данные между строкой '###' и путем '/data' в конце, и во всех файлах этот раздел отформатирован точно так же, с 13 столбцами. Однако "комментарии" в начале и конце любого конкретного файла могут отличаться. У некоторых нет "не удалось открыть отображение XWindow", у других нет путей в конце. Я пытался игнорировать строки, которые начинаются с "#" или "/", но это ничего не делает для самых первых строк или "counts_err_a" и таких строк в конце этого конкретного примера.
Есть ли способ импортировать данные в Python и брать только те строки, которые содержат определенное количество столбцов в них? В псевдокоде это может выглядеть так:
open(file_name)
if column_number = 13
np.genfromtxt(file_name)
else skip
1 ответ
Вы не будете знать, сколько там столбцов, пока не посчитаете их, поэтому вы можете фильтровать файл по мере его чтения, но вам все равно придется split()
линия. Нечто подобное ниже, и вы можете добавить другие проверки, например, если есть много комментариев.
saved_lines = []
with open(filename) as f:
for line in f:
if len(line.split()) == 13:
saved_lines.append(line)
Или эквивалент как comprehension
:
with open(filename) as f:
saved lines = [line for line in f if len(line.split()) == 13]